web-dev-qa-db-fra.com

Comment réparer l'indentation JSON dans vim?

Dans vim, l'indentation par défaut pour JSON est la suivante:

{
    "employees": [
    { "firstName":"John" , "lastName":"Doe" }, 
    { "firstName":"Anna" , "lastName":"Smith" }, 
    { "firstName":"Peter" , "lastName":"Jones" }
    ]
}

Mais ce que j'attends, c'est:

{
    "employees": [
        { "firstName":"John" , "lastName":"Doe" }, 
        { "firstName":"Anna" , "lastName":"Smith" }, 
        { "firstName":"Peter" , "lastName":"Jones" }
    ]
}

J'ai utilisé Google pour essayer quelques plugins vim-json, mais aucun d’entre eux ne résout ce problème.

27
user2309998

Le moyen le plus simple consiste simplement à utiliser une commande externe en tant que filtre pour une sélection. par exemple. 

  1. Faire une sélection
  2. Tapez :!python -m json.tool
29
awesome_person

la recommandation romainl est la méthode recommandée, mais vous devez parfois indenter du texte JSON dans un tampon qui n'a pas le type de fichier json. J'utilise cette belle commande:

command! -range -nargs=0 -bar JsonTool <line1>,<line2>!python -m json.tool

Il suffit de lancer :JsonTool et cela imprimera assez la ligne courante. Cela peut aussi prendre une gamme:

:JsonTool
:'<,'>JsonTool
:10,25JsonTool

Si vous n'avez pas Python ou si vous préférez une solution purement vim, vous devriez peut-être vous intéresser au plugin jdaddy de Tim Pope. Jdaddy fournit des objets texte JSON: aj et ij ainsi que le formatage JSON impression-impression, par exemple. gqaj.

25
Peter Rincker

Vous pouvez envoyer à un outil externe, par exemple, si vous avez python, vous pouvez envoyer le contenu à l'outil json de python à l'aide de:

:%!python -m json.tool
12
Reut Sharabani

python -m json.tool réordonne la position des propriétés de l'objet JSON. Si vous avez un nœud installé, vous pouvez simplement utiliser cette fonction:

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

Mappé sur f-j dans .vimrc

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

Vous pouvez également passer un nombre d'espaces pour un onglet, 2 par défaut si vous n'en spécifiez pas.

4fj

Mon .vimrc complet est ici https://github.com/botverse/.dotfiles/blob/master/.vimrc

7

gg=G est ce dont vous avez besoin si vous utilisez vim.

2
DawnSong

Voici un exemple en Ruby:

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

( https://Gist.github.com/zinovyev/c4b6ec3c24670278adfebfb9ecced84b )

1
zinovyev