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

我想删除以下一项或全部:

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

解决方案

长话短说

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

这会将文件名复制到 未命名寄存器, ,那么你可以使用好旧的 p 粘贴它。当然,您可以将其映射到按键以加快使用速度。

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

您也可以使用它作为完整路径

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

解释

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

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

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

:help let :help expand :help registers 欲了解详情

其他提示

几乎就是你所要求的,它可能会做: Ctrl+R % 将当前文件名拉入您所在的位置(命令提示符、编辑缓冲区...)。看 这个 Vim 提示 了解更多。

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

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

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

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

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

您可能会考虑更直观的映射,例如 <leader>cfr 对于亲戚来说, <leader>cfa 对于绝对的, <leader>cff 仅用于文件名, <leader>cfd 对于目录。

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

如果像我一样,您经常切换到“备用”缓冲区,那么将其完整路径和文件名放在 # 登记。你可以粘贴它 "#p, , 例如。

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

结合其他几个答案的信息:如果您想提取文件的当前完整路径并将其放入另一个窗口的命令缓冲区中,请首先执行以下操作 :let @" = expand("%:p"), ,然后移至另一个窗口并键入 Ctrl+R ".

对于在保留同一目录并保持旧目录打开的情况下复制文件很有用。例如:

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

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

  2. 打开一个新窗口 :sp

  3. 类型 :e Ctrl+R"

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

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

这是我的解决方案:

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

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

nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top