Modo Emacs para editar JSON
unicode (12)
¿Has probado el modo js2 de Steve Yegge para Emacs ?
¿Alguien sabe un buen modo de Emacs para editar JSON? Una aplicación en la que estoy trabajando utiliza un protocolo de comunicación basado en JSON y tener los datos bien sangrados y sintaxis resaltados me ayudaría mucho en el proceso de resolverlo.
+1 para el json-mode Josh - funciona bien para mí. yo añadí
(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)))
y
(define-key json-mode-map (kbd "C-c C-f") ''beautify-json)
a json-mode.el para facilitar la invocación del comando de shell.
ACTUALIZACIÓN: Para aquellos de ustedes con una necesidad / deseo de hacer esto con Unicode, vea mi pregunta here . El resultado es más que usar:
python -mjson.tool
querrás usar
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/")''
esto embellece el JSON y preserva el contenido original de Unicode.
Como JSON es un subconjunto de YAML, yaml-mode
también funciona (no sé cómo se compara con js-mode
y json-mode
).
Instalar (desde emacs): Mx package-install yaml-mode
.
Asociación de yaml-mode
con archivos YAML y JSON, en ~/.emacs.d/init.el
:
(add-to-list ''auto-mode-alist ''("//.yaml$" . yaml-mode))
(add-to-list ''auto-mode-alist ''("//.json$" . yaml-mode))
He preparado una solución alternativa para js2-mode para que analice archivos json sin errores. Puedes encontrarlo en mi comentario: http://code.google.com/p/js2-mode/issues/detail?id=50#c7
(Quería publicarlo como un comentario de la solución de JF Sebastian, pero parece que no tengo permitido hacerlo (sin el enlace ''agregar comentario''))
JSON es compatible con http://www.nongnu.org/espresso/
Me he expandido en la workaround Mariusz Nowak, para que sea utilizable como un modo principal en sí mismo. Se requirieron pequeñas modificaciones más allá de simplemente derivar el modo; el único cambio que realmente necesitaba el trabajo de Nowak era la capacidad de reconocer búferes no asociados con archivos, o asociados con archivos cuyos nombres no terminan en .json
, como JSON, que logramos con una variable local de búfer.
Aquí está la solución aumentada:
(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 ya usa js2-mode, esta puede ser una mejor opción que js-mode
plus flymake-json
porque no necesita instalar nada nuevo (js2-mode ya verifica la sintaxis, no necesita una herramienta externa), y porque este modo heredará su configuración js2-mode, que js-mode no lo hará.
Si quieres algo ligero, prueba este modo mayor que pirateé juntos: https://github.com/joshwnj/json-mode
En realidad, no es más que un resaltado de sintaxis adicional en la parte superior del modo javascript, pero para mis propósitos, he encontrado que funciona bastante bien.
Otro caso de uso común es el formateo automático de un archivo JSON (por ejemplo, si está comprimido en blanco y desea más legibilidad). Para hacer esto, estoy canalizando el búfer a través de un script de línea de comandos: Cu M- |
También recomendaría js2-mode.
JSON significa Notación de Objeto JavaScript. No es otro idioma y ni siquiera es un contenedor de datos como yaml o xml. JSON podría usarse como un contenedor de datos si no hay una función (o en este caso deberíamos decir método) dentro de un objeto JSON, pero no es el objetivo principal de JSON :-)
var myJSObject = {
attr: {foo: "bar", baz: ["quux", "truc", "pouet"]},
fooAlert: function (num) {
alert(this.attr.foo+'' ''+num);
}
};
myJSObject.fooAlert(42);
También utilizaré el modo json de Josh, pero también recomendaré flymake-json como complemento. Ayuda a resaltar los errores de sintaxis.
No me gusta usar python -mjson.tool
porque reordena los elementos en objetos JSON. Encuentro que (prog-indent-sexp)
funciona muy bien para reencantar, y usar jsonlint
lugar de python -mjson.tool
funciona para una bonita impresión / reformateo en 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))
)
)
js3-mode: https://github.com/thomblake/js3-mode
js3-mode es un modo js2 mejorado
Este paquete puede ser instalado por el comando package-list-packages
json.el
por Edward O''Connor es parte de GNU Emacs desde 23.1 (2008).
Si bien no es un resaltador de sintaxis, tiene una función útil para formatear JSON:
M-x json-pretty-print-buffer RET
Entonces, si tiene una versión reciente de Emacs, no hay necesidad de jq
o python -m json.tool
.
js-mode admite resaltado de sintaxis e indentación para archivos json.
Esto es a partir de Emacs 23.2 , cuando se incorporó espresso-mode en Emacs y se cambió el nombre a js-mode.
Échale un vistazo: http://www.nongnu.org/espresso/