Режим Emacs для редактирования JSON - PullRequest
74 голосов
/ 12 января 2009

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

Ответы [ 12 ]

31 голосов
/ 29 октября 2011

+ 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 -m json.tool" (current-buffer) t)))

и

(define-key json-mode-map (kbd "C-c C-f") 'beautify-json)

в json-mode.el для упрощения вызова команд оболочки.

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

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

28 голосов
/ 17 ноября 2011

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

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

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

16 голосов
/ 12 января 2009
15 голосов
/ 22 сентября 2011

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

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

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

9 голосов
/ 30 апреля 2011

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

(Я хотел опубликовать его в качестве комментария для решения Дж. Ф. Себастьяна, но, похоже, мне не разрешено это делать (нет ссылки «Добавить комментарий»))

4 голосов
/ 19 февраля 2017

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

Хотя это не подсветка синтаксиса, у него есть полезная функция для форматирования JSON:

M-x json-pretty-print-buffer RET

Итак, если у вас есть последняя версия Emacs, вам не нужно jq или python -m json.tool.

3 голосов
/ 23 апреля 2015

Поскольку 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))
0 голосов
/ 05 марта 2016

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

0 голосов
/ 29 января 2016

Я также буду использовать второй режим Джоша 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))
  )
)
0 голосов
/ 27 февраля 2015

СП3-режим: https://github.com/thomblake/js3-mode

js3-mode - улучшенный js2-mode

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...