Emacs 23 から、whitespace-mode が空白文字のハイライトに使えるようになった。個人的にこの分野は jaspace をリスペクトしているので、jaspace 風の whitespace にする。
(when (and (>= emacs-major-version 23)
(require 'whitespace nil t))
(setq whitespace-style
'(face
tabs spaces newline trailing space-before-tab space-after-tab
space-mark tab-mark newline-mark))
(let ((dark (eq 'dark (frame-parameter nil 'background-mode))))
(set-face-attribute 'whitespace-space nil
:foreground (if dark "pink4" "azure3")
:background 'unspecified)
(set-face-attribute 'whitespace-tab nil
:foreground (if dark "gray20" "gray80")
:background 'unspecified
:strike-through t)
(set-face-attribute 'whitespace-newline nil
:foreground (if dark "darkcyan" "darkseagreen")))
(setq whitespace-space-regexp "\\( +\\)")
(setq whitespace-display-mappings
'((space-mark ?\xA0 [?\xA4] [?_]) ; hard space - currency
(space-mark ?\x8A0 [?\x8A4] [?_]) ; hard space - currency
(space-mark ?\x920 [?\x924] [?_]) ; hard space - currency
(space-mark ?\xE20 [?\xE24] [?_]) ; hard space - currency
(space-mark ?\xF20 [?\xF24] [?_]) ; hard space - currency
(space-mark ? [?□] [?_]) ; full-width space - square
(newline-mark ?\n [?\xAB ?\n]) ; eol - right quote mark
))
(setq whitespace-global-modes '(not dired-mode tar-mode))
(global-whitespace-mode 1))
万人向けには trailing や space-{before,after}-tab を削除か。hard space 用の設定は、特に今まで悪さをしたことがないので残しているだけ。役に立ったことも無いし、普通に使う分には要らないと思う。
幾つか躓いたこととして、
- (jaspace もそうだったが) develock と相性が悪い。というか develock は face 周りで他の elisp とトラブる印象しかない。もう二度と使わん。:-(
- mule-ucs とも相性が悪い。例えば Meadow3(Emacs 22.3.1) + mule-ucs に最新の whitespace を落としてきてロードするとエラーになる。
後者は相性というより、mule-ucs をロードすると \u3000 のような記述がエラーになるのが原因だと思う。これが私の環境特有なのかは不明だが、whitespace.el (Version 13.2.2)中の \u を \x に置換すると動くようになった。
私にとって jaspace と physical-line は Emacs 三種の神器と言えるものだったが、今ではさっぱりメンテされていないし、いつまで使い続けられるのか不安だった。ところが Emacs 23 では(信じられないことに!)カーソル物理行移動がデフォルトとなり、whitespace がいい仕事をしてくれるようになった。これで心置きなく Emacs を使い続けられる。