将shell命令(!)的输出通过管道传递到Vim中的新缓冲区中


Answers:


27

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

:tabnew | r !echo <c-r>=bufname("#")<cr>

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

:help :tabnew
:help :r!
:help :bar

几乎正是我所需要的,反之亦然,这样我就可以访问当前缓冲区的文件名。注意:已更新问题,以期澄清所需的最终结果。
Richie Marquez 2010年

@Richard Marquez:我更新了这个答案。现在将使用“旧”文件名打开新标签页,因此您可以调用:!echo%
akira 2010年

但并非:r!echo没有改变缓冲区。
Luc Hermitte 2010年

2
@ garyjohn,akira:感谢您的帮助。“ <cr> = ...”部分使Vim喷出了错误,但是我能够通过“:tabnew | r!echo#”使它工作。
Richie Marquez 2010年

1
注意,如果要将其映射到.vimrc中的键,可能也很有用,您需要替换|。带<bar>的字符。
Richie Marquez 2010年

16

这是我的工作。在以上答案的评论中都提到了这一点。

:new | r ! <cmd>
:new | r ! <cmd> #   (# is replaced with filename)

示例1:查找以下位置的所有文本文件/tmp

:new | r ! find /tmp -name '*.txt'

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

:new | r ! ls -la #

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

:new | r ! hg annotate -un #

:new创建一个水平拆分,:vnew如果您想要垂直拆分,请使用它,并:tabnew使用一个新标签。


您也可以在这里回答这个问题吗?它是关于尝试将当前缓冲区与%下一个缓冲区(E499)一起使用。
hhh


2

如果您确实需要将结果存储在新缓冲区中,但需要旧缓冲区中的信息,则可以使用system()

:let res = system('echo '.expand('%'))
:tabnew
:put=res

或存储当前缓冲区名称以供以后使用

:let bn = expand('%')
:tabnew | :r!echo <c-r>=bn<cr>

看到另一个答案,您无需将名称存储在变量中就可以做到。但是反正还是个好答案。
akira

确实。我不知道“#”会给预期的结果在这种情况下-因为我从来没有使用标签
吕克Hermitte
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.