web-dev-qa-db-ja.com

JSONを編集するEmacsモード

JSONを編集するための優れたEmacsモードを知っている人はいますか?私が取り組んでいるアプリは、JSONベースの通信プロトコルを使用し、データを適切にインデントし、構文を強調表示することで、それを理解する過程で大いに役立ちます。

74
Ryszard Szopa

Steve Yeggeの Emacsのjs2-mode を試しましたか?

16
jfs

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コンテンツが保持されます。

31
jstevenco

js-modeは、jsonファイルの構文の強調表示とインデントをサポートします。

これは、Emacs23.2の時点で、espresso-modeがEmacsに組み込まれ、js-modeに名前が変更されたときです。

それをチェックしてください: http://www.nongnu.org/espresso/

28
Steve

軽量なものが必要な場合は、一緒にハッキングしたこのメジャーモードを試してください。 https://github.com/joshwnj/json-mode

実際には、javascript-modeの上で強調表示されている追加の構文にすぎませんが、私の目的では、非常にうまく機能することがわかりました。

別の一般的なユースケースは、JSONファイルの自動フォーマットです(たとえば、空白圧縮されていて、読みやすくしたい場合)。これを行うには、コマンドラインスクリプトを介してバッファをパイピングするだけです。C-uM- |

15
Josh

js2-mode の回避策を用意したので、エラーなしでjsonファイルを解析します。あなたは私のコメントでそれを見つけることができます: http://code.google.com/p/js2-mode/issues/detail?id=50#c7

(コメントとしてJ.F. Sebastianソリューションを投稿したかったのですが、そうすることは許可されていないようです(「コメントを追加」リンクはありません))

9
Mariusz Nowak

json.el by Edward O'Connorは、GNU 23.1(2008)以降のEmacsの一部です。

構文ハイライトではありませんが、JSONをフォーマットするための便利な機能があります。

M-x json-pretty-print-buffer RET

したがって、Emacsの最新バージョンを使用している場合、jqpython -m json.toolは必要ありません。

4
gavenkoa

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))
3
Eric O Lebigot

また、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))
  )
)
0
djb

JSONは espresso-mode でサポートされています

0
逸飞.

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-modeflymake-jsonよりも優れたオプションです。新しいものをインストールする必要がないためです(js2-modeは既に構文チェックを行っており、外部ツールは不要です)。また、このモードはjs2-modeが継承しないjs2-mode構成を継承するためです。

0
Aaron Miller

js3-mode: https://github.com/thomblake/js3-mode

js3-modeは改良されたjs2-modeです

このパッケージは、package-list-packagesコマンドでインストールできます

0
Gang Chen