2009-05-27 131 views
145

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

我想拔一根或全部:

  • 文件名完全一样显示在状态行,例如~\myfile.txt
  • 文件的完整路径,例如c:\foo\bar\myfile.txt
  • 只是文件名,例如myfile.txt
+0

以类似http://stackoverflow.com/q/741024/80161和http://stackoverflow.com/q/2233905/80161 – 2011-05-31 19:50:16

+0

到剪贴板:HTTP: //vi.stackexchange.com/questions/3686/copy-the-full-path-of-current-buffer-to-clipboard – 2015-10-20 08:53:38

回答

167

试试这个:

:let @" = expand("%")

这将文件名复制到unamed寄存器,那么你可以用好老“P”将其粘贴。当然你可以将它映射到一个密钥以便更快使用。

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

你也可以用这个完整路径

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

用途:帮助拓展更多细节

76

你问几乎什么,它可能会做:Ctrl+R %拉动当前文件名到你在哪里(命令提示符下,编辑缓冲区,...)。有关更多信息,请参见this Vim Tip

+0

当你退出编辑模式时,你可以添加文件名:ctrl-“ctrl-%p – stefanB 2009-06-05 05:09:00

+1

stefanB:我无法让它工作:( – dwc 2009-06-05 14:12:09

4

从其他几个答案的组合信息:如果你想抽出当前全并将其放入另一个窗口的命令缓冲区中,首先执行:let @" = expand("%:p"),然后移至另一个窗口并键入Ctrl+R "

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

开始:编辑的src/COM/benatkin /油漆/形状/ Circle.java

  1. 类型:let @" = expand("%:p")(该路径被拽住,主要剪贴板缓冲区。 )

  2. 公开赛:sp

  3. 一个新窗口
  4. 类型:e Ctrl+R"

  5. 使用箭头键返回到圈,并更改为广场,并按<CR>

结束:编辑的src/COM/benatkin /油漆/形状/方。java的

44

如果你想要把当前缓冲区的文件名在您的系统级剪贴板,请尝试更改寄存器@ +:

" relative path 
:let @+ = expand("%") 

" full path 
:let @+ = expand("%:p") 

" just filename 
:let @+ = expand("%:t") 

编辑20140421: 我通常使用这些,所以我创建了一些快捷方式。 Linux Vims apparently operate slightly differently than 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将复制当前缓冲区的相对路径(默认的领导者是反斜杠(\))。我经常使用这些命令在文件上运行命令或在命令行上执行其他操作。我并不经常使用最后一个文件名/目录名。

你可能会考虑像<leader>cfr相对,<leader>cfa绝对,<leader>cff只是文件名,<leader>cfd的目录更加直观映射。

0

我用XCLIP访问X的剪贴板,所以我用:

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

如果你这样做:reg您将在%寄存器查看当前文件的名称。例如,您可以将它粘贴到"%p

如果像我一样,您经常切换到'备用'缓冲区,那么将其完整路径和文件名放在#寄存器中非常方便。例如,您可以将它粘贴到"#p

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

0

这里是我的解决方案:

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