如何修复vim中的JSON缩进?

时间:2013-05-18 04:56:37

标签: javascript json vim

在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插件,但没有一个能解决这个问题。

8 个答案:

答案 0 :(得分:30)

更简单的方法是将外部命令作为选择的过滤器。例如

  1. 进行选择
  2. 输入:!python -m json.tool

答案 1 :(得分:25)

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文本对象:ajij以及打印打印JSON格式,例如: gqaj

答案 2 :(得分:12)

您可以发送到外部工具,例如,如果您有python,您可以使用以下命令将内容发送到python的json工具:

:%!python -m json.tool

答案 3 :(得分:7)

python -m json.tool重新排序JSON对象属性的位置,如果安装了节点,则只需使用此功能:

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

答案 4 :(得分:2)

如果您使用的是vim,则需要

gg=G

答案 5 :(得分:1)

这是Ruby中的一个例子:

:%! ruby -rjson -e "print JSON.pretty_generate(JSON.parse(ARGF.read))"

https://gist.github.com/zinovyev/c4b6ec3c24670278adfebfb9ecced84b

答案 6 :(得分:1)

如果有jqsource)可用,则可以在命令模式下使用:

:%!jq .

答案 7 :(得分:0)

将此语句添加到snapshotchanges

return this.storage.upload(`user_avatar/${n}`, fileToBeUploaded)
    .snapshotChanges()
    .pipe(
        switchMap(refStatus => fileRef.getDownloadURL())
    );

除了为此类文件定义标签行为外,它将强制使用2个空格标签显示json。