LoginSignup
7
4

More than 5 years have passed since last update.

Markdown-modeのみ、ファイル保存時の行末の空白自動削除を無効にする

Last updated at Posted at 2016-07-03

※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-savenil に設定してやればOKです。

この時の注意点としては delete-trailing-whitespece-before-save グローバル変数なので、 make-local-variable でバッファローカル変数にすることで、hookを設定したモード内だけで無効になります。

感想

こんなまどろっこしいことしなくても、もっと簡単に実現できそうですがぐぐっても出てこなかったので自分で書いてみました。
久しぶりにLisp触りましたが、たまになら普段書いてる言事違ってパズルみたいで楽しいですねー

参考

7
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4