Emacsの背景色の設定方法をまとめてみた

Emacs には背景の設定方法がいろいろありすぎてこまる.
なので Emacs 23 以降での背景色,前景色の変更をまとめてみた.

前提知識

face
フォント,前景色,背景色,下線の有無といった,スクリーン上でのテキストの表示に関する属性の集合.
frame
ウィンドウ システムで言うところのウィンドウ.
Emacs で言うところのウィンドウは C-x 2 などで分割したものをいうので注意.
frame-background-mode
背景色が暗い色か明るい色かを表す値.
通常は自動で決定される.
face には frame-background-mode が dark のときと light のときの両方を定義することができる.
背景が黒のときと白のときでシンタックス ハイライトがいい感じに変わってくれるのはこいつのおかげ.
手動で設定できるけど,するもんじゃない.

前景色,背景色の設定方法

自分が知ってる限りだとこんだけある.

  1. custom-set-faces で default face の :background, :foreground を変更する.
  2. default-frame-alist に background-color と foreground-color を追加する.
  3. リソースで変更する.
  4. color-theme.el を使う.
  5. M-x customize-face して,手動で変える.
  6. set-background-color, set-foreground-color で設定する.

1. custom-set-faces で default face の :background, :foreground を変更する.

Emacs が提供している face のカスタマイズ機能を使ったときに Emacs が出力するコードで使われている方法.
.emacs.el に書けば最初から色が変わってる.
最近この方法を知ってからは,Emacs で背景色を変えるもっとも正しい方法なんじゃないかと思ってる.

.emacs.el に書くのはこんな感じ.

(custom-set-faces
 '(default ((t
             (:background "black" :foreground "#55FF55")
             ))))
 '(cursor ((((class color)
             (background dark))
            (:background "#00AA00"))
           (((class color)
             (background light))
            (:background "#999999"))
           (t ())
           )))

default とか cursor っていうのは face の名前で,defaultEmacs 全体の背景と前景,cursor でカーソルの背景と前景が設定できる.


cursor の方では ((class color)... としているが,これは frame-background-modedark のときと light のときの設定を分けているため。
default にも同じように書いてもよい.
default を上記のように記述しておけば,:backgrond に設定した色によって自動で frame-background-mode が決定される.
default にも darklight を設定した場合,Emacsdark の設定で起動するには,

% emacs -rv

として起動するか,後述するリソースに reverseVideo: true を設定する必要がある.

2. default-frame-alist に background-color と foreground-color を追加する.

ブログとかでよく見る気がする.
.emacs.el に書いた場合,起動時に途中で色が変わったりしてなんかやだ.
個人的にはダサイから好きじゃない.

(setq default-frame-alist
      (append
       (list
        '(background-color . "black")
        '(foreground-color . "#55FF55")
        '(cursor-color . "#00AA00")
        )
       default-frame-alist)
      )

この方法でも background-color に設定した色によって frame-background-color が動的に決定される.

3. リソースで変更する.

Emacs の設定ファイルには記述しない方法.
.Xdefaults とか org.gnu.Emacs.plist とかレジストリに書く.
emacs -nw な場合の方法はわからない.

フォントとかも設定できて,システム依存の部分を .emacs.el から完全に分離できるのがいい.

Background や Foreground を設定する代わりに reverseVideo を "true" にすれば,frame-background-mode を dark にすることができる.

Cocoa Emacs の場合

~/Library/Preferences/org.gnu.Emacs.plist に設定を書く.
このファイル自体は Carbon Emacs Package でも使われてたみたい.


内容はこんな感じ.
値はすべて string にする必要がある.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd";>
<plist version="1.0">
<dict>
        <key>Background</key>
        <string>black</string>
        <key>Foreground</key>
        <string>white</string>
</dict>
</plist>
NTEmacs の場合.

NTEmacs ではレジストリに登録する.
Emacs Wiki が参考になると思う.

http://www.emacswiki.org/emacs/MsWindowsRegistry

X Windows System 上の Emacs の場合

~/.Xdefaults か ~/.Xresources に書く.
.Xdefaults や .Xresources の使い方はぐぐればいろいろでてくる.

内容はこんな感じ.

Emacs.Foreground: white
Emacs.Background: black

4. color-theme.el を使う.

color-theme.el に頼る方法.よく知らない.

気になる人は Emacs Wiki を.

http://www.emacswiki.org/emacs/ColorTheme

5. M-x customize-face して,手動で買える.

M-x customize-face ってやって face を指定すると,その face の設定を動的に変更することができる.
default face を変更すれば,frame-background-mode も再計算されてとても便利.
普段は背景色: 黒でプロジェクタに移すとき背景色: 白にしたりフォント サイズを変えたいときに便利.

6. set-background-color, set-foreground-color で設定する.

set-background-color, set-foreground-color 現在の frame の背景色,前景色を変更する方法.
背景を黒のような暗い色にしたとき,シンタックス ハイライトなどの face が白のときのままになっちゃう.
frame-background-mode が dark にならないのが原因だが,frame-background-mode を期待通りに変更する方法は提供されていない.
なので,.emacs.el に書くのにはおすすめしない.
new-frame したとき,set-background-color で設定した色は引き継がれない.

終わりに

ざっくりあげただけでも 6 種類もある.

おすすめは,1. の custom-set-faces を使った方法です.