Emacs Lisp の whitespace.el の設定でかなりはまったのでメモ (Emacs23)

最近、Linux上で作業することが多くなり、
Emacsの設定をきちんとしないことにはストレスが溜まってくる状況になってきた。
なので、本日Emacsの設定を改善してみるべく試みる。


Lispは一応よめる程度で、込み入ったコードはきつい。


さらに、Emacs Lispはグローバルとかバッファローカルとか
少し特殊な概念があって、
Emacs特有の事情で、わからないのか、eLispが読めてないのか わけわかめになって、投げ出すこと数百回。


今回は、上記事情もあり、「調べれば必ずわかる」という信念を元に、
頑張りました。


今日、設定を追加していてはまったのが、以下の whitespace.el である。


結局、以下のように落ち着きましたので、何かの参考に。
Emacs Lisp の公式のドキュメントがどこかにあるのかもしれないけど、
見つけたのは、ソースのコメントと、
Emacs wikiというところの、whitespaceの項目。


はっきりいって、読んでもよくわからない (泣)
日本語の情報を探しても、あまり載ってないし、
載っていても設定の意味が載っていない。 カスタマイズできない(泣)


ソースを読め主義なのか。
歴史が古いんだから、初心者のこと考えてよ、ストールマン



結局↓のようになりました。初心者の視点からはまったポイントも書いておきます。


1.white-space-style
ここに列挙しておかないと、設定が有効にならない。
newline と newline-markの違いとかよくわからないけど、とりあえず記載した。


違いがわかる方がいれば教えてください。m(__)m


2.whitespace-display-mappings と whitespace-space-regexp の関係。
このあたりを混ぜて考えていて、なかなか設定が反映されなかった。
whitespace-display-mappings は、実際の文字を、表示するときに、どう表示するかを規定したもの。
つまり、改行記号の\n を ドルマークにしてください。という感じ。
こういう文字コードを、スペースとして認識してくださいという概念でもないようだし、
ましてや、色(Faceで設定)とかは全く関係ない。
やってないけど、"A" を "あ" と表示してくださいということも、できそうな勢い。
whitespace.elとは別のelispにするべきなような。


それで、whitespace-space-regexpは、whitespaceの名前にふさわしく、
この正規表現にマッチするものを、space と認識するというもののよう。


ちょうど、(set-face-foreground 'whitespace-space "blue") などと対応して、
色をつけたりできます。


3.Emacs lisp正規表現
上の、whitespace-space-regexp を書いていてはまりました。
Emacs Lisp正規表現をはじめて書きましたが 正規表現リテラルがないんですね(泣)
バックスラッシュ多用。
しかも、なぜか解説してくれている人がすくない。
(もしかすると、バックスラッシュ多用だから、HTMLで書くのも大変だからじゃないか。)


さらに、なぜか今回のケース
↓こう書くとダメで
(setq whitespace-space-regexp "[\x0020\x3000]+" )


↓こう書かないとダメでした。
(setq whitespace-space-regexp "\\([\x0020\x3000]+\\)" )


なぜ、グループ化しておかないといけないんだろう。。。


これも、なぜグループにしないといけないのかわかる方がいらっしゃれば教えてください。m(__)m


それにしてもはまりまくったなぁ、今日は。もう日付が変わった。風呂に入ろう。。。


以下に今日追加して難しかったwhitespace.elの箇所を貼っておきます。
何かのご参考になればと。


もっと良い方法や、上記のようにEmacs Lisp正規表現についてのよい情報源などもあれば、
教えていただけますと助かります。

;; 背景は黒主義です。
(set-background-color "black")
(set-foreground-color "white")


;; タブや全角空白などを強調表示
(global-whitespace-mode 1)

;; whitespace-mode の 色設定
;;http://ergoemacs.org/emacs/whitespace-mode.html
(require 'whitespace)
(setq whitespace-style 
      '(face tabs tab-mark spaces space-mark newline newline-mark))

(setq whitespace-display-mappings
      '(
        (space-mark ?\u3000 [?□])  ; 全角スペース
        (space-mark ?\u0020 [?\xB7])  ; 半角スペース
        (newline-mark ?\n   [?$ ?\n]) ; 改行記号
        ) )

(setq whitespace-space-regexp "\\([\x0020\x3000]+\\)" )
;正規表現に関する文書。 Emacs Lispには、正規表現リテラルがないことへの言及
;http://www.mew.org/~kazu/doc/elisp/regexp.html
;
;なぜか、全体をグループ化 \(\) しておかないと、うまくマッチしなかった罠
;
(set-face-foreground 'whitespace-space "blue")
(set-face-background 'whitespace-space 'nil)
(set-face-bold-p 'whitespace-space t)

(set-face-foreground 'whitespace-newline  "DimGray")
(set-face-background 'whitespace-newline 'nil)