shell 命令 (!) 的管道输出到 Vim 中的新缓冲区

Ric*_*uez 45 linux vim

如何将 shell 命令的输出通过管道传输到 Vim 中的新缓冲区中?以下显然行不通,但您可以看到我在说什么:

:!echo % | :newtab
Run Code Online (Sandbox Code Playgroud)

gar*_*ohn 33

您不能将 shell 命令的输出通过管道传输到创建新缓冲区的命令中,但您可以创建一个新缓冲区并将 shell 命令的输出读入该缓冲区,并使用 Vim 命令行上的一个条目。您的示例的工作版本将是

:tabnew | r !echo <c-r>=bufname("#")<cr>
Run Code Online (Sandbox Code Playgroud)

请注意,在这种情况下,管道符号是 Vim ex 命令之间的分隔符,而不是 shell 的管道。也可以看看

:help :tabnew
:help :r!
:help :bar
Run Code Online (Sandbox Code Playgroud)

  • @garyjohn,akira:感谢您的帮助。"&lt;cr&gt;=..." 部分导致 Vim 出现错误,但我能够使用 ":tabnew | r !echo #" 让它工作。 (2认同)

小智 23

这就是我所做的。在上述答案的评论中提到了这一点。

:new | r ! <cmd>
:new | r ! <cmd> #   (# is replaced with filename)
Run Code Online (Sandbox Code Playgroud)

示例 1:查找所有文本文件/tmp

:new | r ! find /tmp -name '*.txt'
Run Code Online (Sandbox Code Playgroud)

示例 2:您正在编辑文件 foo.txt 并且想要运行ls -la foo.txt并在缓冲区中获取输出:

:new | r ! ls -la #
Run Code Online (Sandbox Code Playgroud)

#替换为您正在编辑的原始缓冲区的文件名。这对于特别的源代码控制命令特别有用,例如

:new | r ! hg annotate -un #
Run Code Online (Sandbox Code Playgroud)

:new创建水平拆分,:vnew如果您想要垂直拆分并:tabnew用于新选项卡,请使用。


小智 5

:tabnew | enew | r ! <your shell cmd>
Run Code Online (Sandbox Code Playgroud)

为我工作。