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

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

Ответ 2

+1 для Josh 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-mode.el, чтобы облегчить вызов командной строки.

ОБНОВЛЕНИЕ: Для тех из вас, кто хочет/хочет сделать это с помощью юникода, см. мой вопрос здесь. Результат не используется:

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, и сохраняет исходный контент в Юникоде.

Ответ 3

js-mode поддерживает подсветку синтаксиса и отступы для json файлов.

Это относится к Emacs 23.2, когда эспрессо-режим был включен в Emacs и переименован в js-mode.

Проверьте это: http://www.nongnu.org/espresso/

Ответ 4

Если вы хотите что-то легкое, попробуйте этот основной режим, который я взломал вместе: https://github.com/joshwnj/json-mode

На самом деле это не более чем дополнительная подсветка синтаксиса поверх javascript-режима, но для моих целей я нашел, что он работает очень хорошо.

Другим распространенным вариантом использования является автоматическое форматирование JSON файла (например, если он сжат пробелами и вам нужна более читаемость). Для этого я просто прокладываю буфер через командную строку script: C-u M- |

Ответ 5

Я подготовил обходное решение для js2-mode, чтобы он разбирал json файлы без ошибок. Вы можете найти это в моем комментарии: http://code.google.com/p/js2-mode/issues/detail?id=50#c7

(Я хотел опубликовать его в качестве комментария к решению J.F. Sebastian, но, похоже, мне не разрешено это делать (ссылка "добавить комментарий" ))

Ответ 6

Поскольку JSON является подмножеством YAML, yaml-mode работает тоже (я не знаю, как он сравнивается с js-mode и json-mode, хотя).

Установить (из emacs): M-x package-install yaml-mode.

Ассоциация yaml-mode с файлами YAML и JSON в ~/.emacs.d/init.el:

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

Ответ 8

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

js3-mode - улучшенная js2-мода

Этот пакет может быть установлен командой package-list-packages

Ответ 9

Я также буду использовать Josh json-mode, но также рекомендую flymake-json в качестве дополнения. Это помогает выделить синтаксические ошибки.

Мне не нравится использовать python -mjson.tool, потому что он переупорядочивает элементы в объектах JSON. Я нахожу, что (prog-indent-sexp) работает отлично, чтобы использовать reindent, и используя 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))
  )
)

Ответ 10

Я расширил Mariusz Nowak обходной путь, чтобы сделать его пригодным для использования в качестве основного режима в своем собственном праве. Небольшая модификация требовалась помимо простого вывода режима; единственной заменой, которую действительно требовалась работа Nowak, была способность распознавать буферы, не связанные с файлами, или связанные с файлами, имена которых не заканчиваются на .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-режим, это может быть лучшим вариантом, чем js-mode plus flymake-json, потому что вам не нужно устанавливать ничего нового (js2-режим уже проверяет синтаксис, не требует внешнего инструмента) и потому что этот режим наследует вашу конфигурацию js2-mode, которая не будет работать в режиме js.

Ответ 11

json.el Эдвард О'Коннор является частью GNU Emacs с 23.1 (2008).

Пока это не синтаксис, он имеет полезную функцию M-x json-pretty-print-buffer RET. Поэтому нет необходимости в jq или python -m json.tool.

Ответ 12

Я бы также рекомендовал js2-режим.

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