ずっと frame-background-mode をどう設定したものか悩んでいた。普通はこんなこと気にしなくて良いはずだが、rst-mode が何故か face の明度を決めるのに使っていて、正しく設定しないと heading の明るさが反転してしまう。
docutils-0.8.1/rst.el:
(defcustom rst-level-face-base-light
(if (eq frame-background-mode 'dark)
15
85)
"The lightness factor for the base color. This value is used for level 1.
The default depends on whether the value of `frame-background-mode' is
`dark' or not."
:group 'rst-faces-defaults
:type '(integer)
:set 'rst-set-level-default)
しかし、背景が dark であるか light であるか、どうやって知れば良いのか。むしろそれを知るためにあるような変数名(frame-background-mode)のくせして、初期値 nil (automatic)ってどうよ。まあ私に限って背景は dark 以外あり得ない 訳だが、それでも .emacs 中で dark に決め打ちするのは気持ちが良くない。で、ようやく見つけたのがこれ。
frame-background-mode
nil
(frame-parameter nil 'background-mode)
dark
どうやら frame-parameter には正しい background-mode が入っているらしい。なのでこんな感じ。
(setq frame-background-mode (frame-parameter nil 'background-mode))
もしくは、rst-mode 側の変数を設定する。
(let ((dark (eq 'dark (frame-parameter nil 'background-mode))))
(setq rst-level-face-base-light (if dark 15 85))
(setq rst-level-face-step-light (if dark 7 -7)))
この frame-parameter を参照するパターン、実は何気に便利だった。例えば私の NTEmacs 23.3 (gnupack)では、何故か起動時のカーソルが変な具合になる。具体的には、カーソル点灯時に下の文字が反転表示せずに隠れてしまう。
これはカーソル色を再設定すると直るが、frame-parameter から引っ張ってくれば色名を直記しなくて済む。
(when (eq window-system 'w32)
(set-cursor-color (frame-parameter nil 'foreground-color)))
ここで cursor-color ではなく foreground-color を使っているのは、何故か起動時には cursor-color が black に設定されていて、役に立たないから(この挙動からして変な気がするが)。
2014-06-19 追記
今更だが、docutils-0.9 からは rst-mode が frame-background-mode を使わないようになったので、このエントリは不要。