Yank file name / path of current buffer in Vim

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, e.g. ~\myfile.txt
  • A full path to the file, e.g. c:\foo\bar\myfile.txt
  • Just the file name, e.g. myfile.txt

Why tabs is 3 columns when I am asking it to be 2 columns


how to build vim with cscope feature enabled
Try this:.
How to let cscope use absolute path in cscope.out file?
:let @" = expand("%")
this will copy the file name to the unamed register, then you can use good old 'p' to paste it.

How do I search for “\n” without a preceding “\r” in vim?
and of course you can map this to a key for quicker use..
How to search across a directory of files in vim?
:nmap cp :let @" = expand("%")
you can also use this for full path.
How do I write a vim function that calls VimGrep?
:let @" = expand("%:p")
use :help expand for more details.
How to Limit the Search Scope in VI/VIM?

Are there any ide's out there with good support for vim/vi bindings?


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..


Combining information from a couple of other answers: If you want to yank the current full path to a file and put it into the command buffer in another window, first do :let @" = expand("%:p"), then move to another window and type Ctrl+R ".. Useful for copying a file while staying in the same directory and keeping the old one open.

For example:.
Start: Editing src/com/benatkin/paint/shapes/Circle.java.
  1. Type :let @" = expand("%:p") (The path gets yanked to the main clipboard buffer.).
  2. Open a new window with :sp.
  3. Type :e Ctrl+R".
  4. Use the arrow keys to go back to Circle and change it to Square, and press <CR>.
End: Editing src/com/benatkin/paint/shapes/Square.java.


If you do :reg you will see the name of the current file in the % register.

You can paste it with "%p, for example.. If, like me, you often switch to the 'alternate' buffer, it is very handy that its full path-and-file-name are put in the # register.

You can paste it with "#p, for example.. Note (just in case this is behaviour specific to my setup): I am using VIM 7.4.52 on Ubuntu 14.04.4 LTS..


I use xclip to access X's clipboard, so I use:.
nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR> 


Here is my solution:.
" filename / dirname of the current file {{{     " copy result to the system clipboard and echo the result     " the cb> prompt means the clipboard     " *f*ile *n*ame, ex. 

init.vim map <Leader>fn :let @+ = expand("%:t") \| echo 'cb> ' .

@+<CR> " *f*ile *p*ath, ex.

/home/user/nvim/init.vim map <Leader>fp :let @+ = expand("%:p") \| echo 'cb> ' .

@+<CR> " *d*irectory *p*ath, ex.

/home/user/nvim map <Leader>dp :let @+ = expand("%:p:h") \| echo 'cb> ' .

@+<CR> " *d*irectory *n*ame, ex.

nvim map <Leader>dn :let @+ = expand("%:p:h:t") \| echo 'cb> ' .

@+<CR> " }}}

85 out of 100 based on 65 user ratings 865 reviews