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

duk*_*ave 174 vim clipboard yank

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

我想猛拉一个或全部:

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

JD *_*ias 198

TL; DR

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

这会将文件名复制到unamed寄存器,然后你可以使用good old p来粘贴它.当然,您可以将其映射到密钥以便更快地使用.

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

你也可以用它来完整的路径

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

说明

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

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

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

详情:help let :help expand :help registers请见

  • 酷刚刚把它添加到我的vimrc:noremap <silent> <F4>:让@ + = expand("%:p")<CR> (23认同)
  • 如果您使用`unnamedplus`作为剪贴板,请使用`let @ + = expand("%")` (14认同)
  • 在Windows上,您应该使用:let @*= expand("%"),如果您希望它位于_Windows_剪贴板中. (9认同)
  • 使用`"%:h"`来获取没有文件名的完整路径. (2认同)

dwc*_*dwc 88

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

  • `Ctrl + R%`在`insert`模式下工作 - 但在`edit`模式下,`Ctrl + R`表示重做. (11认同)
  • stefanB的意思是"正常/命令模式的%p.这与insert/cmdline-mode中的<Cr>%相同. (3认同)

Ant*_*zzo 66

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

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

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

" just filename
:let @+ = expand("%:t")
Run Code Online (Sandbox Code Playgroud)

编辑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
Run Code Online (Sandbox Code Playgroud)

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

您可以考虑更直观的映射,例如<leader>cfr相对,<leader>cfa绝对,<leader>cff仅文件名,<leader>cfd目录.

  • 在windows和mac`"*`和`"+`是等价的,所以你可以省去平台检查,只需使用`@ +` (2认同)

Lon*_*Rob 20

答案已在 Neovim/Ubunutu 上测试。

:let @+=@%
Run Code Online (Sandbox Code Playgroud)

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

这个SO答案涉及从一个寄存器复制到另一个寄存器

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


Rob*_*ert 5

如果这样,:reg您将在%寄存器中看到当前文件的名称."%p例如,您可以将其粘贴.

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

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