Yank file name / path of current buffer in Vim

Assuming the current buffer is a file open for edit, so :e does not display E32: No file name .

I would like to yank one or all of:

  • The file name exactly as show on the status line, eg ~myfile.txt
  • A full path to the file, eg c:foobarmyfile.txt
  • Just the file name, eg myfile.txt

  • Try this:

    :let @" = expand("%")

    this will copy the file name to the unamed register, then you can use good old 'p' to paste it. and of course you can map this to a key for quicker use.

    :nmap cp :let @" = expand("%")

    you can also use this for full path

    :let @" = expand("%:p")

    use :help expand for more details


    Almost what you're asking for, and it might do: Ctrl+R % pulls the current filename into where you are (command prompt, edit buffer, ...). See this Vim Tip for more.


    If you want to put the current buffer filename in your system-level clipboard, try changing the register to @+:

    " relative path
    :let @+ = expand("%")
    
    " full path
    :let @+ = expand("%:p")
    
    " just filename
    :let @+ = expand("%:t")
    

    Edit 20140421: I commonly use these, so I created some shortcuts. Linux Vims apparently operate slightly differently than Mac Vims, so there is a special case for that as well. If you put the following in your ~/.vimrc :

    " copy current file name (relative/absolute) to system clipboard
    if has("mac") || has("gui_macvim") || has("gui_mac")
      " relative path  (src/foo.txt)
      nnoremap <leader>cf :let @*=expand("%")<CR>
    
      " absolute path  (/something/src/foo.txt)
      nnoremap <leader>cF :let @*=expand("%:p")<CR>
    
      " filename       (foo.txt)
      nnoremap <leader>ct :let @*=expand("%:t")<CR>
    
      " directory name (/something/src)
      nnoremap <leader>ch :let @*=expand("%:p:h")<CR>
    endif
    
    " copy current file name (relative/absolute) to system clipboard (Linux version)
    if has("gui_gtk") || has("gui_gtk2") || has("gui_gnome") || has("unix")
      " relative path (src/foo.txt)
      nnoremap <leader>cf :let @+=expand("%")<CR>
    
      " absolute path (/something/src/foo.txt)
      nnoremap <leader>cF :let @+=expand("%:p")<CR>
    
      " filename (foo.txt)
      nnoremap <leader>ct :let @+=expand("%:t")<CR>
    
      " directory name (/something/src)
      nnoremap <leader>ch :let @+=expand("%:p:h")<CR>
    endif
    

    Then for example <leader>cf will copy the relative path of the current buffer (the default leader is backslash ( )). I often use these for running commands on a file or doing other things on the command line. I don't really use the last filename / directory name often.

    You might consider more intuitive mappings like <leader>cfr for relative, <leader>cfa for absolute, <leader>cff for just filename, <leader>cfd for directory.

    链接地址: http://www.djcxy.com/p/37634.html

    上一篇: vim路径自动完成,如何进入目录?

    下一篇: 在Vim中当前缓冲区的文件名/路径