在 vim 中,JSON 的默认缩进是:
{
"employees": [
{ "firstName":"John" , "lastName":"Doe" },
{ "firstName":"Anna" , "lastName":"Smith" },
{ "firstName":"Peter" , "lastName":"Jones" }
]
}
但我期望的是:
{
"employees": [
{ "firstName":"John" , "lastName":"Doe" },
{ "firstName":"Anna" , "lastName":"Smith" },
{ "firstName":"Peter" , "lastName":"Jones" }
]
}
我谷歌并尝试了一些 vim-json 插件,但没有一个解决这个问题。
更简单的方法是仅使用外部命令作为选择的过滤器。例如
:!python -m json.tool
romainl 建议是首选方式,但有时您需要在某些不具有
json
文件类型的缓冲区内对 JSON 文本进行相当缩进。我使用这个很好的命令:
command! -range -nargs=0 -bar JsonTool <line1>,<line2>!python -m json.tool
只需运行
:JsonTool
,它就会漂亮地打印当前行。它也可以取一个范围:
:JsonTool
:'<,'>JsonTool
:10,25JsonTool
如果您没有 python 或者更喜欢纯 vim 解决方案,您可能会对 Tim Pope 的 jdaddy 插件感兴趣。 Jdaddy 提供 JSON 文本对象:
aj
和 ij
以及 print 打印 JSON 格式,例如gqaj
。
您可以发送到外部工具,例如,如果您有Python,您可以使用以下方式将内容发送到Python的json工具:
:%!python -m json.tool
python -m json.tool
重新排序 JSON 对象属性的位置,如果安装了 Node,则可以使用此功能:
function FormatJSON(...)
let code="\"
\ var i = process.stdin, d = '';
\ i.resume();
\ i.setEncoding('utf8');
\ i.on('data', function(data) { d += data; });
\ i.on('end', function() {
\ console.log(JSON.stringify(JSON.parse(d), null,
\ " . (a:0 ? a:1 ? a:1 : 2 : 2) . "));
\ });\""
execute "%! node -e " . code
endfunction
映射到 .vimrc 中的
f-j
nmap fj :<C-U>call FormatJSON(v:count)<CR>
您还可以为制表符传递多个空格,如果不指定任何空格,则默认为 2 个。
4fj
我完整的.vimrc在这里https://github.com/botverse/.dotfiles/blob/master/.vimrc
gg=G
。
这是一个 Ruby 示例:
:%! ruby -rjson -e "print JSON.pretty_generate(JSON.parse(ARGF.read))"
(https://gist.github.com/zinovyev/c4b6ec3c24670278adfebfb9ecced84b)
将此声明添加到
/etc/vim/vimrc
:
autocmd Filetype json setlocal ts=2 sw=2 expandtab
除了为此类文件定义制表符行为之外,它将强制使用 2 个空格制表符表示 json。
可以使用python格式化json:
:%!python -m json.tool
此外,还有其他几个工具可以使用,例如
jsbeautify
、prettydiff
、prettier
、jq
和fixjson
。
请参阅 https://medium.com/@codevalues/how-to-explore-a-json-with-thousands-of-lines-using-vim-7f9d1ec550dc 了解更多详细信息。
它类似于 @ivanleoncz (最好和最简单的一个),但有一些额外的功能(也放在 /etc/vim/vimrc 或 ~/.vimrc 上):
au! BufNewFile,BufReadPost *.{json} set filetype=json foldmethod=indent
autocmd FileType json setlocal ts=2 sts=2 sw=2 expandtab modeline autoindent smartindent