我目前处理很多json文件,并且非常喜欢bash comand jq,例如如果要格式化我要格式化的文件

jq . ugly.json > formated.json


现在,我不想离开vim,而是直接在当​​前打开的文件中运行它。

我该怎么办呢?当前文件

但是这仅显示结果,但不更新文件的内容。在一个解决方案上,但不知道为什么有效。如果有人可以指出为什么!起作用,那就太好了。

#1 楼

:!{cmd}{cmd}发送到执行它的外壳并在屏幕上显示其输出。

:{range}!{filter}将来自{range}内部当前缓冲区的行作为{filter}程序的输入,并用其输出替换。 br />
在您的示例中,:%!jq



%是范围,这意味着:当前缓冲区的所有行也被写成1,$(从第一行到最后一行)

jq是过滤器程序

这页描述了编写范围的各种方法。
并且在此页面上,您可以找到过滤器程序的其他使用示例:

:%! xxd [-r]
:%! column -t
:%! sort


第一个用十六进制转储替换二进制文件(或反过来用-r标志)。
第二个将文件中的数据格式化为表格。
第三个按第一个字符对行进行排序。

您可以测试第三个,带有以下简单文件:

3 !
2 world
1 hello


键入:%! sort后,缓冲区将替换为:屏幕,但不会替换缓冲区。

请注意,根据放置的位置,:!sort %符号的含义不同:


爆炸(通常在大多数Ex命令之前),它被解释为一个范围(与%相同),该范围告诉vim必须过滤哪些行
。在大多数Ex命令之后),它会在将完整命令发送到Shell之前扩展为当前文件的名称。有关更多信息,请参见:

/>

#2 楼

凭空想,我发现这两种方法都可以:

或更短:不明白为什么这会更新缓冲区。

评论


因为如果%是范围(即紧接在:之后),则命令(在这种情况下为jq等)作用于当前缓冲区。这类似于:%s / search / replace /在当前缓冲区上的工作方式。

– Flurrywinde
19-09-17在18:41