jsonの validation

flycheck

保存時ではありませんが, 常時チェックしたい場合は flycheckがよいでしょう.
jsonlintを事前にインストールしておく必要があります.

 % npm install jsonlint -g
 M-x package-install <ret> flycheck


問題のある行にカーソルを動かすと minibufferにエラーが表示されます.


M-x flycheck-list-errorsとするとエラー一覧が見えます.


next-error, previous-errorでエラーが発生している場所を移動する
ことができます.

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等で見ることはできますが)


Emacs 24.4以上であれば, Emacsのみで使えるのでお手軽です.
整形される分余計といえば余計ですが...

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を保存時だけ適用してみようかと
思いましたが, ベースが非同期なため, 応用するのが難しそうです.