whitespace-mode
は、スペースやタブなどの不可視文字を見えるようにするモードですが、それだけでなく不要なスペースや改行を削除するための機能もあります。
これを使って、ファイルの保存時に行末のスペースや末尾の改行を削除できるようにします。
不要なスペース・改行の削除
whitespace-mode
の関数whitespace-cleanup
を呼び出すと不要なスペースなどを削除できます。
だたし、whitespace-style
に設定した値によって、何を削除対象とするかの挙動が変わってしまうので注意が必要です。
変数(リスト)whitespace-style
に含めることのできるシンボルと、それが意味する削除対象のうち、主なものは以下の通りです。
シンボル | 削除対象 |
---|---|
empty | バッファの先頭と末尾の空行 |
trailing | 行末のスペース |
その他にも、行頭の余計なスペースを削除したり、インデントに使うタブとスペースの置換も行えるみたいです。
詳しくは、EmacsWiki: White Space を参照してください。
保存時に実行
whitespace-cleanup
をbefore-save-hook
に登録すれば、ファイルの保存時に実行してくれるようになります。
ただ、実行のオン・オフを切り替えるのが少し面倒なので、もう少し簡単に保存時の実行トリガーを設定することができる、whitespace-mode
のwhitespace-action
を利用します。
whitespace-action
は変数(リスト)であり、特定の値を設定しておくと、whitespace-mode
がオンになったときや、ファイルの保存時などに、whitespace-mode
に特定の動作をさせることができます。
whitespace-action
に含めることのできるシンボルと、それが意味する動作のうち、主なものは以下のとおりです。
シンボル | 動作 |
---|---|
cleanup |
whitespace-mode がオンになった時に、削除実行 |
auto-cleanup | ファイルの保存時に、削除実行 |
設定
以下のようになりました。
faceのwhitespace-empty
を大人しめの色などに設定しておかないと、デフォルトだと黄色に表示されるので、かなり見づらいです。
(require 'whitespace)
(setq whitespace-style '(face ; faceで可視化
trailing ; 行末
tabs ; タブ
spaces ; スペース
empty ; 先頭/末尾の空行
space-mark ; 表示のマッピング
tab-mark
))
(setq whitespace-display-mappings
'((space-mark ?\u3000 [?\u25a1])
;; WARNING: the mapping below has a problem.
;; When a TAB occupies exactly one column, it will display the
;; character ?\xBB at that column followed by a TAB which goes to
;; the next TAB column.
;; If this is a problem for you, please, comment the line below.
(tab-mark ?\t [?\u00BB ?\t] [?\\ ?\t])))
;; スペースは全角のみを可視化
(setq whitespace-space-regexp "\\(\u3000+\\)")
;; 保存前に自動でクリーンアップ
(setq whitespace-action '(auto-cleanup))
(global-whitespace-mode 1)
(defvar my/bg-color "#232323")
(set-face-attribute 'whitespace-trailing nil
:background my/bg-color
:foreground "DeepPink"
:underline t)
(set-face-attribute 'whitespace-tab nil
:background my/bg-color
:foreground "LightSkyBlue"
:underline t)
(set-face-attribute 'whitespace-space nil
:background my/bg-color
:foreground "GreenYellow"
:weight 'bold)
(set-face-attribute 'whitespace-empty nil
:background my/bg-color)
markdown-mode
などでauto-cleanupを無効にする
フックを使って、whitespace-action
をnil
に設定してやればいいです。
whitespace-action
はグローバル変数なので、make-local-variable
でバッファローカル変数にしています。
(add-hook 'markdown-mode-hook
'(lambda ()
(set (make-local-variable 'whitespace-action) nil)))