Kennt jemand einen guten Emacs-Modus zum Bearbeiten von JSON? Eine App, an der ich arbeite, verwendet ein JSON-basiertes Kommunikationsprotokoll. Wenn die Daten gut eingerückt und die Syntax hervorgehoben sind, kann ich dies sehr gut herausfinden.
75
Antworten:
Haben Sie Steve Yegges js2-Modus für Emacs ausprobiert ?
quelle
+1 für Joshs Json-Modus - funktioniert gut für mich. Ich fügte hinzu
(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 -m json.tool" (current-buffer) t)))
und
(define-key json-mode-map (kbd "C-c C-f") 'beautify-json)
auf json-mode.el, um den Aufruf des Shell-Befehls zu vereinfachen.
UPDATE: Für diejenigen unter Ihnen, die dies mit Unicode tun möchten, siehe meine Frage hier . Das Ergebnis ist, anstatt zu verwenden:
Sie werden verwenden wollen
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")'
Dies verschönert sowohl den JSON als auch den ursprünglichen Unicode-Inhalt.
quelle
"unicode_escape"
mit JSON-Inhalten verwenden. Verwenden Sieensure_ascii=False
stattdessen.Der js-Modus unterstützt das Hervorheben und Einrücken der Syntax für json-Dateien.
Dies ist , wie von Emacs 23.2 , wenn Espresso-Modus wurde in Emacs integriert und js-Modus umbenannt.
Probieren Sie es aus: http://www.nongnu.org/espresso/
quelle
(setq auto-mode-alist (cons '("\\.json\\'" . js-mode) auto-mode-alist))
meine.emacs
(add-to-list 'auto-mode-alist '("\\.json$" . js-mode))
ist das gleiche, aber etwas kürzer.Wenn Sie etwas Leichtes wollen, probieren Sie diesen Hauptmodus, den ich zusammen gehackt habe: https://github.com/joshwnj/json-mode
Es ist eigentlich nicht mehr als eine zusätzliche Syntax, die zusätzlich zum Javascript-Modus hervorgehoben wird, aber für meine Zwecke habe ich festgestellt, dass es ziemlich gut funktioniert.
Ein weiterer häufiger Anwendungsfall ist die automatische Formatierung einer JSON-Datei (z. B. wenn diese durch Leerzeichen komprimiert ist und Sie eine bessere Lesbarkeit wünschen). Dazu leite ich den Puffer einfach durch ein Befehlszeilenskript: Cu M- |
quelle
Ich habe eine Problemumgehung für den js2-Modus vorbereitet, damit json-Dateien fehlerfrei analysiert werden. Sie finden es in meinem Kommentar: http://code.google.com/p/js2-mode/issues/detail?id=50#c7
(Ich wollte es als Kommentar zur JF Sebastian-Lösung posten, aber es scheint, dass ich das nicht darf (kein Link "Kommentar hinzufügen"))
quelle
json.el
von Edward O'Connor ist seit 23.1 (2008) Teil von GNU Emacs.Es ist zwar kein Syntax-Textmarker, hat aber eine nützliche Funktion zum Formatieren von JSON:
Wenn Sie also eine aktuelle Version von Emacs haben, ist
jq
oder nicht erforderlichpython -m json.tool
.quelle
json-pretty-print-buffer
von GNU Emacs 24.5.1 habe ich festgestellt, dass es meinen JSON zwar gut formatiert, aber auch seinen Inhalt umkehrt. Glücklicherweise stellte ich auch fest, dass ein zweites Ausführen auf meinem JSON die ursprüngliche Reihenfolge wiederherstellt.Da JSON eine Teilmenge von YAML ist,
yaml-mode
funktioniert es auch (ich weiß jedoch nicht, wie es mitjs-mode
und verglichenjson-mode
wird).Installieren (von Emacs) :
M-x package-install yaml-mode
.Zuordnung von
yaml-mode
mit YAML- und JSON-Dateien, in~/.emacs.d/init.el
:(add-to-list 'auto-mode-alist '("\\.yaml$" . yaml-mode)) (add-to-list 'auto-mode-alist '("\\.json$" . yaml-mode))
quelle
JSON wird vom Espresso-Modus unterstützt
quelle
js3-mode: https://github.com/thomblake/js3-mode
Der js3-Modus ist ein verbesserter js2-Modus
Dieses Paket kann mit dem Befehl package-list-packages installiert werden
quelle
Ich werde auch Joshs json-Modus unterstützen, aber auch flymake-json als Ergänzung empfehlen. Es hilft, Syntaxfehler hervorzuheben.
Ich verwende es nicht gern,
python -mjson.tool
weil es Elemente in JSON-Objekten neu anordnet. Ich finde, dass(prog-indent-sexp)
Arbeiten gut zum erneuten Einrücken geeignet sind undjsonlint
anstelle vonpython -mjson.tool
Arbeiten zum hübschen Drucken / Neuformatieren verwendet werdenbeautify-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)) ) )
quelle
Ich habe auf Mariusz Nowak erweitert Abhilfe , es als Hauptmodus in seinem eigenen Recht zu machen verwendbar. Über das einfache Ableiten des Modus hinaus waren nur wenige Änderungen erforderlich. Die einzige Änderung, die Nowaks Arbeit tatsächlich benötigte, war die Fähigkeit, Puffer zu erkennen, die nicht mit Dateien verknüpft sind oder mit Dateien verknüpft sind, deren Namen nicht enden
.json
als JSON , was wir mit einer pufferlokalen Variablen erreichen.Hier ist die erweiterte Problemumgehung:
(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))
Wenn Sie den js2-Modus bereits verwenden, ist dies möglicherweise eine bessere Option als
js-mode
plus,flymake-json
da Sie nichts Neues installieren müssen (der js2-Modus führt bereits eine Syntaxprüfung durch, kein externes Tool erforderlich) und weil dieser Modus Ihren js2-Modus erbt Konfiguration, die js-Modus nicht wird.quelle
Ich würde auch js2-mode empfehlen.
JSON steht für JavaScript Object Notation. Es ist keine andere Sprache und es ist sogar kein Datencontainer wie yaml oder xml. JSON kann als Datencontainer verwendet werden, wenn in einem JSON-Objekt keine Funktion (oder in diesem Fall Methode) vorhanden ist, dies ist jedoch nicht das Hauptziel von JSON :-)
var myJSObject = { attr: {foo: "bar", baz: ["quux", "truc", "pouet"]}, fooAlert: function (num) { alert(this.attr.foo+' '+num); } }; myJSObject.fooAlert(42);
quelle