
Вы пробовали js2-mode для Emacs Стива Йегге?
Однако JSON на самом деле не поддерживается js2-режимом. code.google.com/p/js2-mode/issues/detail?id=50
@ Török Gábor: Знаете ли вы лучшую альтернативу?
Я бы также рекомендовал js2-mode.
JSON расшифровывается как JavaScript Object Notation. Это не другой язык и даже не контейнер данных, как 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);
Точнее, приведенный вами пример - это не JSON, а литерал объекта JavaScript, который похож, но отличается.
Другой язык, который представляет собой контейнер данных, такой как YAML или XML, - это в точности то, что на самом деле представляет собой JSON, а JSON не допускает функций.
JSON поддерживается эспрессо-режим
Я могу заставить работать режим эспрессо только с легальным синтаксисом Javascript. Например, выражения JSON не имеют правильного отступа.
Espresso был включен в GNU Emacs, начиная с версии 23.2, и был переименован в js-mode. режим эспрессо больше не будет поддерживаться за пределами собственно Emacs.
Я подготовил обходной путь для js2-режим, чтобы он анализировал файлы json без ошибок. Вы можете найти это в моем комментарии: http://code.google.com/p/js2-mode/issues/detail?id=50#c7
(Я хотел опубликовать его как комментарий к решению J.F. Sebastian, но, похоже, мне не разрешено это делать (нет ссылки «добавить комментарий»))
Если вы хотите что-то легкое, попробуйте этот основной режим, который я разработал вместе: https://github.com/joshwnj/json-mode
На самом деле это не более чем дополнительная подсветка синтаксиса поверх режима javascript, но для моих целей я обнаружил, что это работает довольно хорошо.
Другой распространенный вариант использования - это автоматическое форматирование файла JSON (например, если он сжат с помощью пробелов и вам нужна более удобная читаемость). Для этого я просто пропускаю буфер через сценарий командной строки: C-u M- |
fwiw, я раздвоил это репо и добавил функцию jstevenco beautify-json, и она находится в github.com/chad3814/json-mode - также отправил запрос на перенос.
Пожалуйста, примените исправление, отличное от ASCII.
FWIW Джош принял запрос Чада на включение добавления jstevenco (получил все это?), Так что на момент написания этой статьи Репозиторий Джоша в json-режиме на github является наиболее актуальным источником для json-режима.
Это ошибка или я что-то не так делаю? emacs.stackexchange.com/q/17319/4003 (я загружаю json-режим в свой .emacs)
+1 за json-режим Джоша - у меня работает хорошо. я добавил
(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.
fwiw, я разветвил json-режим Джоша и добавил к нему дополнение jstevenco в github.com/chad3814/json-mode
Я запросил исправление для не-ASCII udate в github.com/joshwnj/json-mode/issues/5
В последней версии json-mode теперь исправлена проблема с utf-8: см. github.com/joshwnj/json-mode/issues/5
Все это работает, если установить последнюю версию пакет json-mode на мелпа. Хорошие ребята поработали.
не используйте "unicode_escape" с содержимым json. Вместо этого используйте ensure_ascii=False.
js-mode поддерживает выделение синтаксиса и отступы для файлов json.
Это как в Emacs 23,2, когда эспрессо-режим был включен в Emacs и переименован в js-mode.
Проверить это: http://www.nongnu.org/espresso/
Хороший! Я вставил (setq auto-mode-alist (cons '("\\.json\\'" . js-mode) auto-mode-alist)) в свой .emacs
(add-to-list 'auto-mode-alist '("\\.json$" . js-mode)) - то же самое, но немного короче.
js3-режим: https://github.com/thomblake/js3-mode
js3-mode - это улучшенный js2-режим
Этот пакет можно установить командой package-list-packages
Поскольку 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))
Я также буду вторым json-mode Джоша, но также порекомендую 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-режим, это может быть лучшим вариантом, чем js-mode плюс flymake-json, потому что вам не нужно устанавливать ничего нового (js2-mode уже выполняет проверку синтаксиса, нет необходимости во внешнем инструменте), и потому что этот режим унаследует ваш js2 -mode конфигурация, которой не будет js-mode.
json.el Эдварда О'Коннора является частью GNU Emacs с 23.1 (2008 г.).
Хотя это не средство выделения синтаксиса, у него есть полезная функция для форматирования JSON:
M-x json-pretty-print-buffer RET
Итак, если у вас последняя версия Emacs, нет необходимости в jq или python -m json.tool.
Используя json-pretty-print-buffer, входящий в состав GNU Emacs 24.5.1, я обнаружил, что, хотя он хорошо форматирует мой JSON, он также меняет его содержимое. К счастью, я также обнаружил, что повторный запуск его на моем JSON восстанавливает его в исходный порядок.
см. emacs.stackexchange.com/questions/24855/… Я использую js2-режим для проверки JSON