Режим Emacs для редактирования JSON
кто-нибудь знает хороший режим Emacs для редактирования JSON? Приложение, над которым я работаю, использует протокол связи на основе JSON, и наличие данных с красивым отступом и выделенным синтаксисом поможет мне в процессе его выяснения.
12 ответов:
+1 для Джоша json-mode -- работает хорошо для меня. Я добавил
(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)))
и
(define-key json-mode-map (kbd "C-c C-f") 'beautify-json)
в json-режиме.el, чтобы упростить вызов команды оболочки.
обновление: для тех из вас, у кого есть потребность/желание сделать это с unicode, см. мой вопрос здесь. В результате вместо использования:
python -mjson.tool
вы хотите использовать
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\")'
это оба украшает JSON, а также сохраняя оригинальное содержание в формате Юникод.
js-mode поддерживает подсветку синтаксиса и отступ для файлов json.
Это как Emacs 23.2, когда эспрессо-режим был включен в Emacs и переименован в js-режим.
проверить: http://www.nongnu.org/espresso/
Если вы хотите что-то легкое попробовать этот основной режим я взломал вместе:https://github.com/joshwnj/json-mode
на самом деле это не более чем дополнительная подсветка синтаксиса поверх javascript-режима, но для моих целей я обнаружил, что он работает довольно хорошо.
Другой распространенный вариант использования-Это автоматическое форматирование файла JSON (например. если он сжат пробелами, и вы хотите больше читаемости). Для этого я просто передаю буфер через командную строку сценарий: C-u M -/
Я подготовил обходной путь для js2-mode таким образом, он анализирует файлы json без ошибок. Вы можете найти его в моем комментарии:http://code.google.com/p/js2-mode/issues/detail?id=50#c7
(Я хотел опубликовать его в качестве комментария к решению J. F. Sebastian, но, похоже, мне это не разрешено (нет ссылки "добавить комментарий"))
так как JSON является подмножеством YAML,
yaml-mode
тоже работает (я не знаю, как это сравнивается сjs-mode
иjson-mode
, хотя).установить (из emacs):
M-x package-install yaml-mode
.
json.el
Эдвард О'Коннор является частью GNU Emacs с 23.1 (2008).хотя это не синтаксический маркер, он имеет полезную функцию для форматирования JSON:
M-x json-pretty-print-buffer RET
Итак, если у вас есть последняя версия Emacs, нет необходимости
jq
илиpython -m json.tool
.
JSON поддерживается эспрессо-режим
js3-mode:https://github.com/thomblake/js3-mode
js3-mode-это улучшенный js2-mode
этот пакет может быть установлен командой package-list-packages
Я также буду вторым JSON-режимом Джоша, но также рекомендую flymake-json в качестве дополнения. Это помогает выделить синтаксические ошибки.
Я не люблю использовать
python -mjson.tool
потому что он переупорядочивает элементы в объектах JSON. Я нахожу(prog-indent-sexp)
работает просто отлично переиндентировать, и с помощьюjsonlint
вместоpython -mjson.tool
работает для красивой печати / переформатирования в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)) ) )
я расширил на Мариуша Новака решение, чтобы сделать его пригодным для использования в качестве основного режима в своем собственном праве. Небольшая модификация требовалась помимо простого получения режима; единственное изменение, которое действительно требовалось работе Новака, - это способность распознавать буферы, не связанные с файлами, или связанные с файлами, имена которых не заканчиваются на
.json
, как JSON, который мы выполняем с буферно-локальной переменной.вот расширенный обходной путь:
(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))
если вы уже используете js2-mode, это может быть лучшим вариантом, чем
js-mode
плюсflymake-json
потому что вам не нужно устанавливать ничего нового (js2-mode уже выполняет проверку синтаксиса, нет необходимости во внешнем инструменте), и потому что этот режим унаследует вашу конфигурацию js2-mode, которую js-mode не будет.
Я бы также рекомендовал js2-mode.
JSON обозначает обозначение объекта JavaScript. Это не другой язык,и это даже не контейнер данных, как yaml или xml. JSON может быть использован в качестве контейнера данных, если нет функции (или в этом случае мы должны сказать метод) внутри объекта JSON, но это не основная цель JSON: -)
var myJSObject = { attr: {foo: "bar", baz: ["quux", "truc", "pouet"]}, fooAlert: function (num) { alert(this.attr.foo+' '+num); } }; myJSObject.fooAlert(42);