Хтось знає хороший режим Emacs для редагування JSON? Додаток, над яким я працюю, використовує протокол зв'язку на основі JSON, і якщо дані мають гарний відступ та виділення синтаксису, це дуже допомогло б мені в процесі з’ясування цього.
Хтось знає хороший режим Emacs для редагування JSON? Додаток, над яким я працюю, використовує протокол зв'язку на основі JSON, і якщо дані мають гарний відступ та виділення синтаксису, це дуже допомогло б мені в процесі з’ясування цього.
Відповіді:
Ви пробували режим js2 Стіва Єгге для 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.
"unicode_escape"
з вмістом json. Використовуйте ensure_ascii=False
замість цього.
js-режим підтримує виділення синтаксису та відступ для файлів json.
Це станом на Emacs 23.2 , коли режим еспресо був включений в Emacs і перейменований в js-режим.
Перевірте: 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))
це те саме, але трохи коротше.
Якщо ви хочете чогось легкого, спробуйте цей основний режим, який я зламав разом: https://github.com/joshwnj/json-mode
Це насправді не більше ніж додаткове підсвічування синтаксису поверх режиму javascript, але для моїх цілей я виявив, що він працює досить добре.
Інший поширений випадок використання - це автоматичне форматування файлу JSON (наприклад, якщо він стиснений пробілами і ви хочете отримати більше читабельності). Для цього я просто прокладаю буфер через сценарій командного рядка: Cu M- |
Я підготував обхідний спосіб для js2-режиму, щоб він аналізував файли json без помилок. Ви можете знайти його в моєму коментарі: http://code.google.com/p/js2-mode/issues/detail?id=50#c7
(Я хотів опублікувати його як коментар до рішення JF Sebastian, але, схоже, мені це не дозволено (немає посилання "додати коментар"))
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 відновлює його початковий порядок.
Оскільки 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 підтримується режимом еспресо
js3-режим: https://github.com/thomblake/js3-mode
js3-mode - це вдосконалений js2-режим
Цей пакет можна встановити за допомогою команди package-list-пакети
Я також підтримаю 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-режим, це може бути кращим варіантом, ніж js-mode
плюс, flymake-json
тому що вам не потрібно встановлювати нічого нового (js2-режим вже виконує перевірку синтаксису, немає необхідності в зовнішньому інструменті), і оскільки цей режим успадкує ваш js2-режим конфігурації, якого js-режиму не буде.
Я також рекомендую js2-режим.
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);