web-dev-qa-db-fra.com

Mode Emacs pour éditer le JSON

Est-ce que quelqu'un connaît un bon mode Emacs pour éditer le JSON? Une application sur laquelle je travaille utilise un protocole de communication basé sur JSON et le fait que les données soient bien mises en retrait et mises en évidence par la syntaxe me serait très utile dans le processus de résolution.

74
Ryszard Szopa

Avez-vous essayé le mode js2 de Steve Yegge pour Emacs ?

16
jfs

+1 pour Josh's json-mode - fonctionne bien pour moi. J'ai ajouté

(defun beautify-json ()
  (interactive)
  (let ((b (if mark-active (min (point) (mark)) (point-min)))
        (e (if mark-active (max (point) (mark)) (point-max))))
    (Shell-command-on-region b e
     "python -mjson.tool" (current-buffer) t)))

et

(define-key json-mode-map (kbd "C-c C-f") 'beautify-json)

sur json-mode.el pour faciliter l’appel de commandes Shell.

UPDATE: Pour ceux d'entre vous qui ont un besoin/désir de le faire avec Unicode, voir ma question ici . Le résultat est plutôt que d'utiliser:

python -mjson.tool

vous voudrez utiliser

python -c 'import sys,json; data=json.loads(sys.stdin.read()); print json.dumps(data,sort_keys=True,indent=4).decode(\"unicode_escape\").encode(\"utf8\",\"replace\")'

cela permet à la fois d’embellir le JSON et de préserver le contenu Unicode d’origine.

31
jstevenco

js-mode prend en charge la coloration syntaxique et l'indentation des fichiers json.

C'est à partir de Emacs 23.2, lorsque le mode expresso a été incorporé à Emacs et renommé js-mode.

Vérifiez-le: http://www.nongnu.org/espresso/

28
Steve

Si vous voulez quelque chose de léger, essayez ce mode majeur que j'ai piraté: https://github.com/joshwnj/json-mode

Ce n'est en réalité rien de plus qu'une mise en surbrillance syntaxique supplémentaire en plus du mode javascript, mais pour les besoins de mon travail, je trouve que cela fonctionne assez bien.

Un autre cas d'utilisation courant est le formatage automatique d'un fichier JSON (par exemple, s'il est compressé avec des espaces et que vous souhaitez plus de lisibilité). Pour ce faire, je passe simplement dans le tampon à l'aide d'un script de ligne de commande: C-u M- |

15
Josh

J'ai préparé une solution de contournement pour js2-mode afin qu'il analyse les fichiers json sans erreurs . Vous pouvez le trouver dans mon commentaire: http://code.google.com/p/js2-mode/issues/detail? id = 50 # c7

(Je voulais le poster en tant que commentaire, solution J.F. Sebastian, mais il semble que je ne suis pas autorisé à le faire (pas de lien 'ajouter un commentaire'))

9
Mariusz Nowak

json.el par Edward O'Connor fait partie de GNU Emacs depuis le 23.1 (2008).

Bien que ce ne soit pas un surligneur de syntaxe, il a une fonction utile pour formater le JSON:

M-x json-pretty-print-buffer RET

Donc, si vous avez une version récente d’Emacs, il n’est pas nécessaire d'utiliser jq ou python -m json.tool.

3
gavenkoa

Puisque JSON est un sous-ensemble de YAML, yaml-mode fonctionne également (je ne sais pas comment il se compare à js-mode et json-mode, cependant).

Installer (à partir d'emacs): M-x package-install yaml-mode.

Association de yaml-mode avec les fichiers YAML et JSON, dans ~/.emacs.d/init.el:

(add-to-list 'auto-mode-alist '("\\.yaml$" . yaml-mode))
(add-to-list 'auto-mode-alist '("\\.json$" . yaml-mode))
3
Eric O Lebigot

Je seconderai également le mode json de Josh, mais je recommanderai également flymake-json en complément. Cela aide à mettre en évidence les erreurs de syntaxe.

Je n'aime pas utiliser python -mjson.tool car il réorganise des éléments dans des objets JSON . Je trouve que (prog-indent-sexp) fonctionne très bien pour se réindiquer et que jsonlint Au lieu de python -mjson.tool fonctionne pour jolie impression/reformatage dans beautify-json

(eval-after-load "json-mode"
  '(progn
     (require 'flymake-json)
     ;; flymake-cursor displays error in minibuffer message area instead of requiring hover
     (require 'flymake-cursor)

     (add-hook 'json-mode-hook 'flymake-json-load)
     (define-key json-mode-map "\C-c\C-n" (function flymake-goto-next-error))
  )
)
0
djb

JSON est pris en charge par espresso-mode

0
逸飞.

J'ai développé la solution de contournement de Mariusz Nowak , pour la rendre utilisable en tant que mode majeur à part entière. Peu de modifications étaient nécessaires au-delà de la simple dérivation du mode; le seul changement dont le travail de Nowak avait réellement besoin était la capacité de reconnaître les mémoires tampons non associées à des fichiers, ou associées à des fichiers dont le nom ne se termine pas par .json, en tant que JSON, ce que nous réalisons avec une variable tampon locale.

Voici la solution de contournement augmentée:

(make-variable-buffer-local 'js2-parse-as-json)

(defadvice js2-reparse (before json)
    (setq js2-buffer-file-name buffer-file-name))
(ad-activate 'js2-reparse)

(defadvice js2-parse-statement (around json)
    (if (and (= tt js2-LC)
           js2-buffer-file-name
           (or js2-parse-as-json
               (string-equal (substring js2-buffer-file-name -5) ".json"))
           (eq (+ (save-excursion
                    (goto-char (point-min))
                    (back-to-indentation)
                    (while (eolp)
                      (next-line)
                      (back-to-indentation))
                    (point)) 1) js2-ts-cursor))
      (setq ad-return-value (js2-parse-assign-expr))
        ad-do-it))
(ad-activate 'js2-parse-statement)

(define-derived-mode json-mode js2-mode "JSON"
  "Major mode for editing JSON data."
  :group 'json
  (setq js2-parse-as-json t)
  (js2-reparse t))

(add-to-list 'auto-mode-alist '("\\.json$" . json-mode))

Si vous utilisez déjà js2-mode, cette option est peut-être meilleure que js-mode plus flymake-json car vous n'avez pas besoin d'installer quoi que ce soit de nouveau (le mode js2 vérifie déjà la syntaxe, aucun outil externe n'est nécessaire) et ce mode héritera de votre js2. -mode configuration, ce que js-mode ne fera pas.

0
Aaron Miller

js3-mode: https://github.com/thomblake/js3-mode

le mode js3 est un mode js2 amélioré

Ce paquet peut être installé par la commande package-list-packages

0
Gang Chen