如何将当前文件名插入Vim中的内容?


38

经过一些搜索,我知道:echo @%在vim-screen的底行显示了当前文件名。

我想将文件名(带有和不带有完整路径)转储到文件的内容中而不会离开vim

有什么办法吗?

Answers:


27

我确定还有其他方法可以执行此操作...但是您想要的主要命令是:r[ead]将命令的输出插入缓冲区。

因此,仅插入文件名:

:r! echo %

并且,包括完整路径:

:r! echo %:p

有关更多信息:

:help read
:help filename-modifiers 

37

当前文件名在"%寄存器中,因此您可以使用<c-r>%;将其插入(在插入模式下)。完整路径可以用插入<c-r>=expand("%:p")。如果经常使用它,您可以对其进行宏化。有关更多类似技巧,请参阅:h expand:h "=


也许我<c-r>读错了,但是没有映射为重做命令吗?
JC Yamokoski 2012年

10
在插入模式下,<c-r>指定下一个字符是寄存器。
凯文

Righto,谢谢。完全忘了切换到插入模式...
JC Yamokoski 2012年

您也可以"%p在正常或视觉模式下进行操作。
naught101 '17

15

从中可以看到:h registers"%寄存器包含当前文件名。该:pu[t]命令将寄存器的内容插入文本。

因此,要插入实际的文件名,可以在命令模式下键入以下任意一个:

:put %

要么

"%p

要插入具有完整路径的文件名,请键入

:put=expand('%:p')

在命令模式下。


更多信息:

:h pu[t]

通过键入"rp您可以粘贴register的内容"r


3
:put "%:p"似乎并没有为我工作也。它似乎只能与expand()一起使用,如in :put =expand('%:p'):,这使它不像<c-r>=expand('%:p')不幸的那样麻烦。
akavel

@akavel您是正确的,我将更新答案。谢谢!;)实际上,两者都是一样冗长。
braunmagrin 2015年

5

一种简单的方法是运行:

!!echo %
  • !! 用其后的命令结果替换当前行。

  • % 在命令中被替换为已编辑文件的名称,因此这将有效地将该名称插入已编辑文件中。

文件名是您传递给vi(m)命令的文件名,可能包含相对或绝对路径。如果您要剥离它并仅保留文件名,请运行

!!basename %

1

如果您需要经常执行此操作,则按照http://vim.wikia.com/wiki/Insert_current_filename将键序列绑定到所需的键可能很有用。

在插入模式下,在光标位置插入当前文件名,但不带扩展名。

:inoremap \fn <C-R>=expand("%:t:r")<CR>

要保留扩展名,请执行以下操作:

:inoremap \fn <C-R>=expand("%:t")<CR>

要插入使用文件的目录的绝对路径:

:inoremap \fn <C-R>=expand("%:p:h")<CR>

要插入文件正在使用的目录的相对路径:

:inoremap \fn <C-R>=expand("%:h")<CR>

以上所有内容都可以直接vim用于该会话,也可以将其放在.vimrc(该行的前导冒号是可选的)中。


0

我正在搜索一种将当前文件名(没有路径或扩展名)插入当前位置(没有新行,没有替换当前行)的最简单方法。因此,结合之前的答案和此链接,这就是我想要的。

插入模式下:

<C-R>=expand("%:t:r")

然后下一次(该命令已在历史记录中):

<C-R>=<UP>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.