在Vim中当前缓冲区的文件名/path

假设当前缓冲区是一个打开进行编辑的文件,所以:e不显示E32: No file name

我想抽出一个或所有的:

  • 文件名完全如状态行所示,例如~\myfile.txt
  • 文件的完整path,例如c:\foo\bar\myfile.txt
  • 只是文件名,例如myfile.txt

尝试这个:

  :let @“= expand(”%“) 

这将复制文件名到unamed寄存器,然后你可以使用旧的'p'来粘贴它。 当然你也可以把它映射到一个密钥,以便更快速的使用。

  :nmap cp:let @“= expand(”%“) 

你也可以使用这个完整的path

  :let @“= expand(”%:p“) 

使用:帮助扩大更多的细节

几乎你所要求的,它可能会: Ctrl+R %将当前文件名拉到你所在的位置(命令提示符,编辑缓冲区,…)。 有关更多信息,请参阅此Vim提示 。

如果要将当前缓冲区文件名放入系统级剪贴板,请尝试将该寄存器更改为@ +:

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

编辑20140421:我通常使用这些,所以我创build了一些快捷方式。 Linux Vims显然与Mac Vims稍有不同 ,所以还有一个特例。 如果你把~/.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 

然后,例如<leader>cf将复制当前缓冲区的相对path(默认领导者是反斜杠( \ ))。 我经常使用这些命令在文件上运行命令或在命令行上执行其他操作。 我不经常使用最后的文件名/目录名。

你可能会考虑更直观的映射,如相对的<leader>cfa ,绝对的<leader>cff ,文件名的<leader>cff ,目录的<leader>cfd

结合其他几个答案中的信息:如果要将当前的完整path放到一个文件中,并将其放到另一个窗口的命令缓冲区中,请首先执行:let @" = expand("%:p") ,然后移动到另一个窗口并键入Ctrl+R "

有用的复制文件,同时保持在同一目录,并保持旧的打开。 例如:

开始 :编辑src / com / benatkin / paint / shapes / Circle.java

  1. 键入:let @" = expand("%:p") (path被抽取到主剪贴板缓冲区中。)

  2. :sp打开一个新窗口

  3. 键入:e Ctrl+R"

  4. 使用箭头键返回到圆形并将其更改为方形,然后按<CR>

结束 :编辑src / com / benatkin / paint / shapes / Square.java

如果你这样做:reg你会看到在%注册当前文件的名称。 例如,你可以粘贴"%p

如果像我一样,经常切换到“备用”缓冲区,将完整path和文件名放在#寄存器中非常方便。 例如,你可以粘贴"#p

注意(以防万一这是我的设置特定的行为):我在Ubuntu 14.04.4 LTS上使用VIM 7.4.52。

我使用xclip来访问X的剪贴板,所以我使用:

 nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR> 

这是我的解决scheme:

 " 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> " }}}