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-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 を使わないようになったので、このエントリは不要。