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

1:



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?

2:


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


3:


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


4:


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.


5:


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


6:


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


7:


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