假设当前缓冲区是一个打开编辑的文件,那么:e不会显示E32: No文件名。

我想要扯掉其中一个或全部:

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


当前回答

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

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

开始:编辑src/com/benatkin/paint/shapes/Circle.java 类型:let @" = expand("%:p")(路径被拉到主剪贴板缓冲区。) 用:sp打开一个新窗口 类型:e Ctrl+R" 使用方向键返回圆形并将其更改为正方形,并按<CR> 结束:编辑src/com/benatkin/paint/shapes/Square.java

其他回答

几乎就是你想要的,它可能会这样做:在INSERT模式下,Ctrl+R %将当前文件名拉到你所在的位置(命令提示符,编辑缓冲区,…)更多信息请看Vim提示。

答案在Neovim/ ubuntu上测试过。

:let @+=@%

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

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

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

博士TL;

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

这将把文件名复制到未命名寄存器,然后你可以使用p来粘贴它。当然,您可以将其映射到键,以便更快地使用。

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

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

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

解释

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

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

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

有关详细信息,请参见:help let:help expand:帮助寄存器

如果您执行:reg,您将在%寄存器中看到当前文件的名称。例如,您可以用“%p”粘贴它。

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

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

我把它放在我的vimc中:

nnoremap yl :let @" = expand("%:p")<cr>