雑な JSON のバリデーション
わざわざ 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-json
は nil を返すようにしている。
write-contents-functions
(とか write-file-hooks
とか local-file-write-hooks
) は non-nil な値を返す関数があると save-buffer
を中断するからである。