ardggy's blog

Esc - Meta - Alt - Ctrl - Shift

雑な JSON のバリデーション

syohex.hatenablog.com

わざわざ jsonlint いれるのもいやだし、jq のエラーメッセージをパースするのもだるいしと思っていたら、json-pretty-print-buffer がエラーを吐いてくれるという。

バッファの中身を整形されるのが問題なら、テンポラリバッファでやればよさそう。 保存するときのフックにかけておいて、Invalid ならセーブできないようにしよう。

(autoload 'json-pretty-print-buffer "json")

(defun validate-json ()
  (let ((buffer (current-buffer)))
    (with-temp-buffer
      (erase-buffer)
      (insert-buffer-substring buffer)
      (json-pretty-print-buffer)
      nil)))

(use-package json-mode
  :ensure t
  :mode (("\\.json\\" . json-mode))
  :defer t
  :config
  (add-hook 'json-mode-hook 'json-mode-config)
)

(defun json-mode-config ()
  (add-hook 'write-contents-functions 'validate-json nil t) ; local-hook
)

validate-jsonnil を返すようにしている。 write-contents-functions (とか write-file-hooks とか local-file-write-hooks) は non-nil な値を返す関数があると save-buffer を中断するからである。