Режим Emacs для редактирования JSON


кто-нибудь знает хороший режим Emacs для редактирования JSON? Приложение, над которым я работаю, использует протокол связи на основе JSON, и наличие данных с красивым отступом и выделенным синтаксисом поможет мне в процессе его выяснения.

12 73

12 ответов:

вы пробовали js2-режим для Emacs?

+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);