JSONを編集するための優れたEmacsモードを知っている人はいますか?私が取り組んでいるアプリは、JSONベースの通信プロトコルを使用し、データを適切にインデントし、構文を強調表示することで、それを理解する過程で大いに役立ちます。
Steve Yeggeの Emacsのjs2-mode を試しましたか?
Joshの+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に移動して、シェルコマンドの呼び出しを簡単にします。
UPDATE:unicodeでこれを行う必要性/欲求をお持ちの方は、私の質問 here をご覧ください。結果は以下を使用することではありません:
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コンテンツが保持されます。
js-modeは、jsonファイルの構文の強調表示とインデントをサポートします。
これは、Emacs23.2の時点で、espresso-modeがEmacsに組み込まれ、js-modeに名前が変更されたときです。
それをチェックしてください: http://www.nongnu.org/espresso/
軽量なものが必要な場合は、一緒にハッキングしたこのメジャーモードを試してください。 https://github.com/joshwnj/json-mode
実際には、javascript-modeの上で強調表示されている追加の構文にすぎませんが、私の目的では、非常にうまく機能することがわかりました。
別の一般的なユースケースは、JSONファイルの自動フォーマットです(たとえば、空白圧縮されていて、読みやすくしたい場合)。これを行うには、コマンドラインスクリプトを介してバッファをパイピングするだけです。C-uM- |
js2-mode の回避策を用意したので、エラーなしでjsonファイルを解析します。あなたは私のコメントでそれを見つけることができます: http://code.google.com/p/js2-mode/issues/detail?id=50#c7
(コメントとしてJ.F. Sebastianソリューションを投稿したかったのですが、そうすることは許可されていないようです(「コメントを追加」リンクはありません))
json.el
by Edward O'Connorは、GNU 23.1(2008)以降のEmacsの一部です。
構文ハイライトではありませんが、JSONをフォーマットするための便利な機能があります。
M-x json-pretty-print-buffer RET
したがって、Emacsの最新バージョンを使用している場合、jq
やpython -m json.tool
は必要ありません。
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))
また、2番目のJoshのjsonモードを使用しますが、追加としてflymake-jsonもお勧めします。構文エラーを強調するのに役立ちます。
python -mjson.tool
を使用するのは好きではありません。JSONオブジェクトのアイテムを並べ替えるからです。 (prog-indent-sexp)
が再インデントにうまく機能し、python -mjson.tool
の代わりにjsonlint
を使用すると、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は espresso-mode でサポートされています
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-modeを使用している場合、これはjs-mode
とflymake-json
よりも優れたオプションです。新しいものをインストールする必要がないためです(js2-modeは既に構文チェックを行っており、外部ツールは不要です)。また、このモードはjs2-modeが継承しないjs2-mode構成を継承するためです。
js3-mode: https://github.com/thomblake/js3-mode
js3-modeは改良されたjs2-modeです
このパッケージは、package-list-packagesコマンドでインストールできます