Кто-нибудь знает хороший режим Emacs для редактирования JSON? Приложение, над которым я работаю, использует протокол связи на основе JSON и имеет четкие отступы и подсветку синтаксиса, которые очень помогли бы мне в этом разобраться.
Режим Emacs для редактирования JSON
Ответ 1
Вы пробовали Steve Yegge js2-mode для Emacs?
Ответ 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))
Ответ 7
JSON поддерживается эспрессо-режим
Ответ 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);