34

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

4

8 回答 8

41

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

  1. 进行选择
  2. 类型:!python -m json.tool
于 2013-06-26T15:47:10.013 回答
26

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打印打印 JSON 格式,例如gqaj.

于 2013-05-18T15:34:05.093 回答
15

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

:%!python -m json.tool
于 2014-10-14T07:59:39.400 回答
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

映射到f-j.vimrc

nmap fj :<C-U>call FormatJSON(v:count)<CR>

您还可以为制表符传递多个空格,如果您未指定任何空格,则默认为 2。

4fj

我完整的 .vimrc 在这里https://github.com/botverse/.dotfiles/blob/master/.vimrc

于 2015-04-02T10:34:34.980 回答
6

如果您有jq( source ) 可用,则可以在命令模式下使用:

:%!jq .
于 2019-10-21T01:34:15.267 回答
3

gg=G如果您使用 vim,这就是您所需要的。

于 2017-03-15T08:15:18.093 回答
1

这是 Ruby 中的一个示例:

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

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

于 2017-09-18T12:29:34.223 回答
1

将此语句添加到/etc/vim/vimrc

autocmd Filetype json setlocal ts=2 sw=2 expandtab

除了为此类文件定义制表符行为外,它将强制使用 2 个空格制表符进行 json 演示。

于 2020-09-30T22:38:31.593 回答