2011-12-04

Emacs: background-mode


ずっと 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-parameter nil 'background-mode)
dark    ; result

どうやら frame-parameter には正しい background-mode が入っているらしい。なのでこんな感じ。
(setq frame-background-mode (frame-parameter nil 'background-mode))

または、frame-background-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 からは frame-background-mode を使わないようになっているので、最近の Emacs を使っていれば本エントリーは無用。