前回、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