※Emacs Lispに全く詳しくないため、もっといい方法があれば教えていただけると嬉しいです。
ファイル保存時に行末の空白を自動削除する
個人的に行末の空白が残っているのは、コミット時に無駄な差分が出る原因にもなるのであまり好みではありません。そのため、ファイルの保存時に空白が削除されるように下記の用に設定していました。
(add-hook 'before-save-hook 'delete-trailing-whitespace)
こうすることによって、ファイル保存前に行末の空白が削除されます。
ところが、Markdownを書くときに改行のためのスペース2つもこの設定により削除されてしまいます。Markdownを書く時は大体KobitoやGitHubだったのであまり気になりませんでしたが、たまに README.md
の編集で改行ができなくて流石にストレスだったので、特定のモードの時に無効にできるようにしてみました。
特定のモードで無効にする設定
コード
(追記)Emacs24.4以降を使っているのであれば、@tadsan さんにコメント頂いたやり方のほうがすっきりして良いと思います。
(defvar delete-trailing-whitespece-before-save t)
(defun my-delete-trailing-whitespace ()
(if delete-trailing-whitespece-before-save
(delete-trailing-whitespace)))
(add-hook 'before-save-hook 'my-delete-trailing-whitespace)
; 無効にしたいモードのhook
(add-hook 'markdown-mode-hook
'(lambda ()
(set (make-local-variable 'delete-trailing-whitespece-before-save) nil)))
解説
というほどのものでもありませんが、
グローバル変数に delete-trailing-whitespece-before-save
を定義しておきます。そして、 delete-trailing-whitespece-before-save
が真の時のみ delete-trailing-whitespace
を実行する関数を定義し、 before-save-hook
で発火するようにします。
そして、無効にしたいモードのhookで delete-trailing-whitespece-before-save
を nil
に設定してやればOKです。
この時の注意点としては delete-trailing-whitespece-before-save
グローバル変数なので、 make-local-variable
でバッファローカル変数にすることで、hookを設定したモード内だけで無効になります。
感想
こんなまどろっこしいことしなくても、もっと簡単に実現できそうですがぐぐっても出てこなかったので自分で書いてみました。
久しぶりにLisp触りましたが、たまになら普段書いてる言事違ってパズルみたいで楽しいですねー