EmacsのX Windowフォントの設定方法(3)

次に、X resourcesでEmacsのフォントセットの定義を行ってみる。
今回は、Emacs22用の定義を~/.Xdefaultsに書いた。~/.Xresourcesでも良い。筆者の環境では.XdefaultsはEmacs起動の度に、.XresourcesはXセッション起動時のみ読み込まれ、両方ある場合は.Xdefaultsが無視される。全ユーザー共通の設定なら/usr/X11R6/lib/X11/app-defaults/以下のファイルに書いても良い。それらを以下、リソースファイルと呼ぶ。

説明の前に、リソースファイルでのEmacsのフォントセットの定義の例を示す。(ascii文字は東雲(しののめ)フォント、日本語は東風(こち)フォントにする例)

Emacs.Fontset-0: -shinonome-gothic-medium-r-normal--16-*-*-*-*-*-fontset-kochi16g,\
katakana-jisx0201:-kochi-gothic-medium-r-normal--16-*-*-*-*-*-jisx0201.*-*,\
japanese-jisx0208:-kochi-gothic-medium-r-normal--16-*-*-*-*-*-jisx0208.*-*
Emacs.Fontset-1: -shinonome-mincho-medium-r-normal--16-*-*-*-*-*-fontset-kochi16m,\
japanese-jisx0208:-kochi-mincho-medium-r-normal--16-*-*-*-*-*-jisx0208.*-*,\
katakana-jisx0201:-kochi-mincho-medium-r-normal--16-*-*-*-*-*-jisx0201.*-*

1つのフォントセットの定義は次のようなフォーマットで書く。
Emacs.Fontset-[n]: (asciiのフォント名)-fontset-(フォントセット名),\
 (文字セット名): (フォント名),\
 (文字セット名): (フォント名)...

まずフォント名であるが、筆者のFreeBSD 7.3のEmacs22はxftをサポートしていないので、フォント名は全て、ハイフンで区切られた14個のフィールドからなる、XLFD(X Logical Font Definition)表記である。XftをサポートしているEmacsではxftのフォント名を用いた別の書き方があるのかも知れないが、筆者は今の所知らない。Xftをサポートしている筆者のEmacs23でも、elispのx-list-fontsを実行するとEmacsで使用可能なフォントのリストがXLFD形式で得られるので、X Window上のEmacsのフォント設定において、XLFDと縁が切れることは当分無いと思う。
幸いにして、フォント指定時はXLFDのほとんどのフィールドにワイルドカードが使えるので、全てのフィールドを理解する必要は無い。大体、
-(フォント名)-(ファミリー)-(medium/bold)-(r/i)-normal-*-(サイズ)-*-*-*-*-*-(文字セット名)-(Encoding)
で十分と思う。mediumは通常、boldは太字、rは通常、iは斜体(Italic)である。文字セット名以降の部分は、iso8859-1ならそのまま(1がEncodingの部分)だが、jisx0208の場合はjisx0208.1983-0のようにjisx0208の後にピリオドとさらなる情報があり、さらにEncodingが0だったり1だったり2だったりするので、面倒ならjisx0208.*-*と指定するのが良い。

1行目の[n]の部分は、0から始まる連番でなければならない。Emacs.Fontset-1以上しか無ければ1つも有効にならないし、0,1,2と4以上しか無ければ0,1,2の分しか有効にならない。(過去には連番でなくてもいい方法があったような気がするが、Emacs22のInfoには見つけられなかった)

1行目のasciiのフォント名の部分は、"iso8859-1"の代わりに"fontset-(フォントセット名)"と書く。これにより、新たなフォントセットが定義される。実際のasciiのフォントは、"fontset-(フォントセット名)"の部分を"iso8859-1"に置換されたものが使われる。
iso8859-1に限らず、"fontset-(フォントセット名)"の部分を*-*にして該当する全ての(Emacsがサポートする)文字セットのフォントが、そのフォントセットのデフォルトとして使われるようである。例えば、

Emacs.Fontset-2: -shinonome-gothic-medium-r-normal--16-*-*-*-*-*-fontset-shinonome16

と書くと、iso-8859-1のみでなく、jisx0208やjisx0201についても東雲フォントが使われるようになる。
従って、1行目のasciiのフォント設定だけで足りることもある。その場合は、2行目以降と1行目のカンマ以降は不要である。

最初の例(東雲フォントと東風フォントの例)のように、特定の文字セットに対してasciiのフォントとは別のフォントを指定する時は、"(文字セット名): (フォント名)"という形式で、カンマで区切って書く。次の行に書く場合は(XLFDなら普通次の行に書くであろう)、行末に"\"(バックスラッシュ)を置いて次の行に書く。
Emacsがサポートする文字セット名は、M-x list-character-setsとすると調べられる(Emacs22以前ならM-x describe-fontsetの出力でもわかる)。
同じ行の\の後(改行コードの前)には何も書いてはいけない(直後の改行文字をエスケープするためのものであるため)。カンマの前にはスペースを入れてはいけないが、カンマの後ろなら良い。コロンも同様である。

リソースファイルへのフォントセットの定義が済んだら、それが読み込まれる状態で(自動的に読み込まれないならXを再起動するなりxrdb -mergeするなりして)Emacsを起動して確認する。最初からデフォルトのフォントを定義したフォントセットにするのは、フォントセットの定義に誤りがあるとEmacsが起動しないことがあるので、避けた方がいいと思う。
Emacsのウィンドウ上でShift+左クリックでポップアップメニューを開き、"Fontset"のメニューに定義したフォントセットが出てこなければ失敗である。
Fontsetメニューに出てきて選択可能でも、成功しているとは限らない。定義に問題があると、フォントが切り替わっても、フォントセットの定義がそのまま使われず、自動的にフォントセットが再構築されてしまうことがある。定義通りになっているかどうかは、そのフォントセットに切り替え、定義に関係する全文字セットの最低1文字ずつを含むファイルを開いた後、M-x describe-fontsetして確認する。もし、1行目に出てくるフォントセット名が、定義した名前でなく"fontset-default"や"fontset-auto??"となっていると、失敗している可能性が高い。そこはクリアしていても、一部の文字セットのフォントが正しく読まれていないかも知れないので、[]内のワイルドカードが展開されたフォント名をそれぞれ確認すると良いと思う。

1行目のmedium/bold、r/iの別は、フォントセット名と共に、フォントセットを区別する情報として用いられる。同じフォントセット名に対して、medium-r, bold-r, medium-i, bold-iのそれぞれのフォントセットを定義することが可能であり、そのようにすると、同じバッファにレギュラー体とイタリック体、細字と太字が混在する時も、それらの全てのフォントセットを設定することができる(1つのバッファに指定できるフォントセット名は1つであり、そのフォントセット名のmedium-rのフォントとかbold-rのフォントとかが使われる)。
残念ながら、medium/boldやr/iの部分を*にして、(medium/bold)-(r/i)の4通りのフォントセットを1つのEmacs.Fontset-[n]にまとめて定義することはできないようである。従って、同じフォントセット名で(medium/bold)-(r/i)の4通りを定義するには、Emacs.Fontset-[n]が4つ必要になる。
例:

Emacs.Fontset-20: -kappa-*-medium-r-normal--20-*-*-*-*-*-fontset-kappa
Emacs.Fontset-21: -kappa-*-medium-i-normal--20-*-*-*-*-*-fontset-kappa
Emacs.Fontset-22: -kappa-*-bold-r-normal--20-*-*-*-*-*-fontset-kappa
Emacs.Fontset-23: -kappa-*-bold-i-normal--20-*-*-*-*-*-fontset-kappa

今回、筆者がFreeBSD 7.3のpackagesで手当り次第に日本語のフォントをインストールして、Emacs22で使えそうなフォントを、リソースファイルにフォントセット定義として色々登録してみたものを、参考までに添付する。
リソースファイルへの記述例
Emacs.Fontset-0〜3は、intlfontsというパッケージに含まれるサンプルをそのまま使用したものである。それ以降は、筆者が主に16〜20ドットを使うので、その範囲のサイズを重点的に定義している。

参考:Emacs InfoのDefining fontsetsの章


XLFD名の確認は、xfontselというアプリまたはそのクローン(今回はnexfontselにお世話になった)を使うのが定番である。しかし、筆者はこれがあまり使いやすいとは思わず(結局最後はこれに頼ったが)、複数のフォントを一覧表示したかったので、片っ端からEmacsで表示してHTMLにしてみた。
フォント一覧のトップページ
"tt-数字"はTrueType(要xft、Emacs23で表示したもの)、"tt-noaa"とあるのはTrueTypeの中のアンチエイリアスされないフォント(xft不要、Emacs22で表示したもの)、"tt"が無いのはpcfやbdf等のビットマップフォントである。
結局あまり役に立たなかったが、苦労したので、しばらく記念に残しておく。これをどのようにして作ったかは、後日説明する。

今回、かくの如く膨大な時間をかけて調べ、長大な.Xdefaultsを書いてEmacs22のフォントを色々設定してみた結果、最終的に筆者が気に入ったのは、asciiもjisx0208もjisx0201も東雲ゴシックの16ドットに揃えたもの(上記リンク先のリソースファイルのfontset-shinonome16gに相当)であった。
そして、筆者のEmacs22のfontset-standard、すなわち.Xdefaultsに何も書かなくても存在するフォントセットは、一通りの東雲ゴシックの16ドットであった(号泣)

以前(昔のFreeBSDかEmacs21)はfontset-standardが東雲ゴシックではなかったと思うのだが…