FreeBSDのxtermでフォントの設定をする
前回、FreeBSD+Xorg上のxtermで、IBus+Mozcを使ってVimで日本語の文書を編集できるようにしました。ロケールはja_JP.UTF-8にしました。
が、使い始めてすぐに、日本語のボールド(太字)フォントが点線の□で表示されてしまうことに気づきました。たとえば、Vimで挿入モードに入ると、本来は画面下に「– 挿入 –」と表示されるはずが、「– □□ –」のように表示されてしまいます。ちなみに、en_US.UTF-8のロケールだとメッセージは英語になりますが、その場合は「– INSERT –」と、ちゃんとボールドで表示されます。つまり、いわゆる全角ボールドだけが表示されない状態です。
そこでまず、素のxterm(ただしロケールは指定し、UTF-8モードになっている)がどうやってフォントを決めているのかを調べてみました。
1カラム幅(いわゆる半角)のノーマルフォントは、Xのリソース「*VT100.utf8Fonts.font」の値から「-misc-fixed-medium-r-semicondensed–13-120-75-75-c-60-iso10646-1」に決まります。リソースの値は「appres XTerm | grep utf8Fonts.font:」などで確認できます。このデフォルト値は、/usr/local/lib/X11/app-defaults/XTermに書かれています。
半角のボールドフォントは、ノーマルフォントのXLFDの4番目(SLANT)を「bold」に変えたものを探し、その結果「-misc-fixed-bold-r-semicondensed–13-120-75-75-c-60-iso10646-1」に決まります。
一方、2カラム幅(いわゆる全角)のノーマルフォントは、半角のノーマルフォントのXLFDをベースに、3番目(WEIGHT_NAME)をmediumに変え(もともとmediumですが)、5番目(SETWIDTH_NAME)と6番目(ADD_STYLE_NAME)をはずし、12番目(AVERAGE_WIDTH)を倍の120にした「-misc-fixed-medium-r---13-120-75-75-c-120-iso10646-1」という条件で探します。これで「-misc-fixed-medium-r-normal-ja-13-120-75-75-c-120-iso10646-1」に決まります。
最後、全角のボールドフォントは、全角のノーマルフォントのXLFDの4番目(SLANT)を「bold」に変えたものを探します。しかしこれは存在しないので、該当フォントなしになります。どうやらこれが、全角ボールドが表示されない原因のようです。
そこで、全角ボールドのフォントを明示的に指定してみることにしました。フォント指定のオプションは、
- 半角ノーマルが-fn (リソース指定ならXTerm*utf8Fonts.font)
- 半角ボールドが-fb (リソース指定ならXTerm*utf8Fonts.boldFont)
- 全角ノーマルが-fw (リソース指定ならXTerm*utf8Fonts.wideFont)
- 全角ボールドが-fwb (リソース指定ならXTerm*utf8Fonts.wideBoldFont)
です。そこで、
xterm -fwb -misc-fixed-medium-r-normal-ja-13-120-75-75-c-120-iso10646-1
とすることで、全角ボールドも全角ノーマルと同じフォントになり、ちゃんと文字が表示されるようになりました(太字にはなりませんが)。
……ただ、いろいろ試しているうちに、例えば
xterm -fb -misc-fixed-bold-r-normal--13-120-75-75-c-70-iso10646-1
とした場合でも全角ボールドが表示されることが分かりました。これだと上で述べたロジックに反するので、きっとどこか認識が誤っているのだと思います。ただしこの場合、「– 挿入 –」の「挿」の字だけがoverstrike(1ピクセルずらして重ね打ち)した状態で表示されたりして、なんだか怪しげな状態です。
ちなみに、ここまで述べてきた指定は伝統的なXLFDでのフォント指定ですが、FreeTypeでのフォント指定の場合は、
- 半角フォントが-fa (リソース指定ならXTerm*faceName)
- 全角フォントが-fd (リソース指定ならXTerm*faceNameDoublesize)
- フォントサイズが-fs (リソース指定ならXTerm*faceSize)
になります。
それから、xtermの1カラムの幅は、半角フォントで指定したフォントの中で最大の文字幅(例えば大文字のWの幅)が採用されます。つまり、-fnや-faでプロポーショナルフォントを指定したり、漢字を含むフォントを指定した場合などは、文字の間隔がとても間延びしてしまい、実用に耐えません。半角フォントには、固定文字幅で半角だけを含むフォント(FreeTypeならMonospaceとかCourierとか)を指定しましょう。
※バージョンメモ
- FreeBSD 8.2-RELEASE
- xorg-7.5.1
- xterm-269_3
- vim-7.3.121