如何在Vim中保存时自动格式化JSON

Ali*_*Ali 47 format vim json lint

说实话go已经宠坏了我.随着go我习惯了我的编辑(vim)强制执行的严格格式标准,并且几乎被团队和世界各地的所有人接受和遵循.

我想以同样的方式保存JSON文件格式.

问题:如何在vim中保存时自动格式化/缩进/ lint json文件.

Jos*_*e B 73

在一个命令中,试试这个:

execute '%!python -m json.tool' | w  
Run Code Online (Sandbox Code Playgroud)

然后,您可以添加自己的键绑定,以使其更简单的击键.当然,为了实现这一点,您需要在您的计算机上安装Python.

  • `|的目的是什么?在这里?为什么不呢:`:%!python -m json.tool`? (3认同)
  • `| w`仅保存缓冲区,如果没有缓冲区,您将获得json格式的信息,但更改将无法保存。我猜这取决于您想要什么。 (2认同)

Kyr*_*Kyr 39

如果你热衷于使用外部工具并且你正在使用json做一些工作,我建议使用jq:

https://stedolan.github.io/jq/

然后,您可以:%!jq .在vim内执行,它将使用jq的输出替换当前缓冲区.

  • 对于寻找Windows方式的人,将单引号更改为双引号:`:%!jq"."`假设您下载了jq的Windows版本,并将其从`jq-win64.exe`重命名为` jq.exe`(类似于32位版本).另外,请确保它在您的路径中. (3认同)
  • 我不必在`.`,`:%前后加上引号!jq .`为我工作,或`:%!jq --indent 4。 (3认同)
  • 我更喜欢“jq”而不是 python 命令,因为 python 可能会根据编码更改内容。例如`{"test": "ü"}`,其中`"ü"`在`:%!python -m json.tool`之后变成`"\u00fc"` (2认同)

Peg*_*sus 13

%!python -m json.tool

要么

%!python -c "import json, sys, collections; print json.dumps(json.load(sys.stdin, object_pairs_hook=collections.OrderedDict), ensure_ascii=False, indent=4)"

你可以将它添加到你的vimrc:

com! FormatJSON %!python -m json.tool

比你可以使用:FormatJson格式json文件


Ali*_*Ali 8

感谢mMontu和Jose B,这就是我最终做的事情:

警告这将覆盖您的缓冲区.因此,如果您打开已经存在语法错误的json文件,您将丢失整个文件(或者可能丢失它).

将此行添加到您的 ~/.vimrc

" Ali: to indent json files on save
autocmd FileType json autocmd BufWritePre <buffer> %!python -m json.tool
Run Code Online (Sandbox Code Playgroud)

当然,你需要在你的机器上安装python.

编辑:如果你的json有错误,下一个不应该覆盖你的缓冲区.这使得它成为正确的答案,但由于我没有很好地掌握Vim脚本或shell,所以我把它作为一个实验性的东西,你可以尝试,如果你感到幸运.它也可能取决于你的shell.你被警告了.

" Ali: to indent json files on save
autocmd FileType json autocmd BufWritePre <buffer> %!python -m json.tool 2>/dev/null || echo <buffer>
Run Code Online (Sandbox Code Playgroud)


mMo*_*ntu 6

在vim.org上搜索JSON插件返回了以下内容:

jdaddy.vim:JSON操作和漂亮的打印

它具有以下说明:

gqaj “漂亮的打印”(包装/缩进/排序键/否则清除)光标下的JSON构造。

如果它符合您期望的格式,则可以autocmd BufWritePre在保存时创建to格式。