delete-trailing-whitespace周りの設定

http://shibayu36.hatenablog.com/entry/20101109/1289314475


行末のスペースを消すために delete-trailing-whitespaceを
before-save-hookに設定している人は多いと思いますが、pull requestの
ときなどに余計な差分を作ってしまい困ることがあります。そのため
id:shibayu36さんのエントリのように toggle関数を作っている方も
いると思うのですが、単純に toggleしただけでは今どっちなんだっけと
わからなくなることがあります。


それをモードラインで確認できるようにしておくと、いくらか捗ると
思いますので、その設定を示します。

(defvar my/current-cleanup-state "")

;; 行末のスペース + ファイル末尾の連続する改行の除去を行う
(defun my/cleanup-for-spaces ()
  (interactive)
  (delete-trailing-whitespace)
  (save-excursion
    (save-restriction
      (widen)
      (goto-char (point-max))
      (delete-blank-lines))))

(add-hook 'before-save-hook 'my/cleanup-for-spaces)

(setq-default mode-line-format
              (cons '(:eval my/current-cleanup-state)
                    mode-line-format))

(defun toggle-cleanup-spaces ()
  (interactive)
  (cond ((memq 'my/cleanup-for-spaces before-save-hook)
         (setq my/current-cleanup-state
               (propertize "[DT-]" 'face '((:foreground "turquoise1" :weight bold))))
         (remove-hook 'before-save-hook 'my/cleanup-for-spaces))
        (t
         (setq my/current-cleanup-state "")
         (add-hook 'before-save-hook 'my/cleanup-for-spaces)))
  (force-mode-line-update))
(global-set-key (kbd "M-g M-d") 'toggle-cleanup-spaces)


delete-trailing-whitespaceが無効な場合は以下のようにモードラインの
左端に「DT-」が表示されます。有効な場合は長さ 0の文字列が表示、つまり
見えないことになります。