我目前处理很多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