用shell命令的输出替换vim中的选定内容

18
我需要将vim中选定的文本作为参数传递给curl命令。例如,我需要能够运行以下命令:

curl -sSd css="body { border-radius: 5px; }" http://prefixr.com/api/index.php

来自vim的。显然,“body { border-radius: 5px; }”部分是动态的。通常在vim中以可视模式进行选择。

我如何获取所选文本并将其作为参数传递给curl?


与将选定文本作为STDIN提供给shell命令相关的问题:在信息行上管道到shell并接收输出在shell中进行管道传输,处理整个缓冲区 - user1129682
4个回答

22

您可以使用:!命令通过外部程序过滤所选文本。该文本被输入到stdin中,并用stdout的结果替换。

在这种情况下,您需要使用cat和命令替换将行作为curl的参数传递,例如:

:'<,'>!curl -sSd css="`cat`" http://prefixr.com/api/index.php

有点取巧,但这正是我想要的。谢谢。 - harithski
10
看起来这个命令只能作用于选中行,而不是选中的文本。比如说,如果一行是"abcde",我选中了"bcd"并运行命令 :'<,'>!python3 -c 'print(input()+"x")' ,得到的结果是"abcdex"而不是"abcdxe"。我在某个地方看过,使用 \<`>可以代替'<'>` 来操作选中文本,但是对我来说这种方法并不适用。 - AkiRoss
正是这样的东西使得 Vim 成为最伟大的编辑器。谢谢! - mljrg

1
通过选择一行或多行并使用 :!,你可以将这些行传递给一个命令,例如:
因此,想要使用 sort 命令对整个文件进行排序,请尝试输入 ggVG !sort,它在编辑器中应该看起来像这样:

B

C

A

:'<,'>!sort


1
我知道“!”可以让你运行一个shell命令,但是我想将选择内容复制到shell命令的某个部分,而不仅仅是管道传输。 - harithski

0

如果想要将单词连接起来而不产生多余的换行符,请参考以下示例,将选定的文本转换为大写:

选择区域 c 控制-r = 系统("perl -pe '$=uc($)'", @")

解释:选择区域,c 表示更改选择,C-r 表示执行表达式。 注意:dollar 是 dollar underscore,但是下划线在发布后不可见。


0

现在 无法测试,因此不能百分之百确定它是否有效

esc,然后

:r ! curl -sSd="`cat`" http://prefixr.com/api/index.php`

请在我明天尝试之前,不要轻易点踩,好吗? :) - Kimvais
6
回答前先试一下怎么样? - user98761

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接