jsonの validation
flycheck
保存時ではありませんが, 常時チェックしたい場合は flycheckがよいでしょう.
jsonlintを事前にインストールしておく必要があります.
% npm install jsonlint -g
M-x package-install <ret> flycheck
問題のある行にカーソルを動かすと minibufferにエラーが表示されます.
M-x flycheck-list-errorsとするとエラー一覧が見えます.
json-pretty-print-buffer
Emacs 24.4より, 追加された整形コマンド json-pretty-print-bufferを利用する.
整形コマンドですが, JSONが invalidだとエラーが minibufferに表示されます.
(add-hook 'after-save-hook 'json-pretty-print-buffer)
before-save-hookでなく, after-save-hookなのは, 'Save...'みたいな
メッセージで肝心のエラーが見えなくなってしまう問題を防ぐためです.
(view-echo-area-messages等で見ることはできますが)
jsonlintのみを使う
無理やりですが, 保存時にエラーがある場合, その内容を popupする
ようにしてみます.
(defun my/json-validate () (let ((file (buffer-file-name))) (with-current-buffer (get-buffer-create "*my/jsonlint*") (setq buffer-read-only nil) (erase-buffer) (unless (zerop (process-file "jsonlint" nil t nil file)) (pop-to-buffer (current-buffer)))))) (defun my/javascript-mode-hook () (when (string-suffix-p ".json" (buffer-file-name)) (add-hook 'before-save-hook 'my/json-validate))) (add-hook 'js-mode-hook 'my/javascript-mode-hook)
おわりに
本題とはずれてしまうかもしれないですが, パッケージを入れることに抵抗がなければ,
flycheckがよいのではないかと思います. flycheckを保存時だけ適用してみようかと
思いましたが, ベースが非同期なため, 応用するのが難しそうです.