Yim文件名/ Vim中当前缓冲区的路径

时间:2009-05-27 16:56:30

标签: vim clipboard yank

假设当前缓冲区是一个可供编辑的文件,因此:e不会显示E32: No file name

我想要猛拉一个或全部:

  • 与状态行中显示的文件名完全相同,例如~\myfile.txt
  • 文件的完整路径,例如c:\foo\bar\myfile.txt
  • 只是文件名,例如myfile.txt

8 个答案:

答案 0 :(得分:188)

<强> TL; DR

:let @" = expand("%")&GT;

这会将文件名复制到 unamed register ,然后您可以使用旧的p来粘贴它。当然,您可以将其映射到密钥以便更快地使用。

:nmap cp :let @" = expand("%")<cr>

您也可以将其用于完整路径

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

<强>解释

Vim使用未命名的寄存器来存储已删除或复制(抽取)的文本,同样在粘贴它时会读取此寄存器中的文本。

使用let我们可以使用:let @" = "text"手动将文本存储在寄存器中,但我们也可以存储表达式的结果。

在上面的例子中,我们使用扩展通配符和关键字的函数expand。在我们的示例中,我们使用expand('%')来扩展当前文件名。我们可以将其修改为expand('%:p')以获取完整的文件名。

有关详细信息,请参阅:help let :help expand :help registers

答案 1 :(得分:84)

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

答案 2 :(得分:59)

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

" 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表示目录。

答案 3 :(得分:5)

如果您执行:reg,您将在%注册表中看到当前文件的名称。例如,您可以使用"%p粘贴它。

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

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

答案 4 :(得分:4)

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

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

  

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

     
      
  1. 键入:let @" = expand("%:p") (路径被拉到主剪贴板缓冲区。)

  2.   
  3. 使用:sp

  4. 打开一个新窗口   
  5. 输入:e Ctrl+R"

  6.   
  7. 使用箭头键返回Circle并将其更改为Square,然后按&lt; CR&gt;

  8.         

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

答案 5 :(得分:1)

这是我的解决方案:

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

在Neovim / Ubunutu上测试的答案。

据我所知,%寄存器已经包含相对文件路径,因此就像将%寄存器的内容移动到代表您喜欢的剪贴板的任何寄存器一样简单。

This SO answer处理从一个寄存器复制到另一个寄存器的问题

:let @+=@%

对我来说似乎很简单。不需要任何难以记住的expand()东西。