2008年10月15日の日記の2番目の記事へのコメント

Emacs23のフレーム幅が変

そんな具合で uim.el でも Anthy の辞書にある UTF-8 な文字を入力できることが確認できたわけなんですが,色々いじってたら問題発覚.インライン変換候補をウィンドウの右の方で出すと表示位置がずれます.何コレ.

変換候補の表示位置がずれる

・・・というかよく見るとフレーム (他のアプリケーションでいうところのウィンドウ) の初期幅が超でかいんですけどwww

幅が異常にでかいフレーム

数えてみたら丁度半角英数字160文字分の幅がありました.デフォルトで80文字分の幅に設定しているので倍になっちゃってる感じですかね.試しに .emacs で幅を40文字分に変更してみたら丁度80文字分の幅になったので多分正解.とはいえ半分にしたところで変換候補の表示位置がずれるとかそういう問題は何も解決しませんが.

160文字分の幅があった

.emacsの設定がおかしいのかと思ったんですが,「-q」をつけて Emacs23 を起動しても同じように横長のフレームが生成されちゃいます.くそー,何だこれ.

あれこれ試しているうちに,.fonts.conf をリネームして無効化した状態で「emacs -q -fn "IPAGothic"」とかやって起動すると設定通り半角英数字で80文字分の幅になることが判明.ただし,昔よく遭遇した「半角英数字が全角文字と同じ幅を占めてしまい全体的に間延びした感じに表示されてしまう」現象付きですが・・・

文字が間延びした状態

調べた所,この現象は fontconfig でフォントの「globaladvance」属性(?)を「false」にすれば出なくなるとかで (以前は fontconfig か何かにパッチを当てて回避していたような),手元の .fonts.conf でも ↓なことをやってきちんと回避してました.

 <match target="font">
  <test compare="contains" target="pattern" name="lang">
   <string>zh-tw</string>
   <string>zh-cn</string>
   <string>ja</string>
   <string>ko</string>
  </test>
  <edit name="spacing"><int>0</int></edit>
  <edit name="globaladvance"><bool>false</bool></edit>
 </match>

・・・ふぅ・・・ってこれは何も関係ないじゃないか orz.fontconfig のバージョンを 2.4.2 に落としてみたり libXft のバージョンを 2.1.13 に上げてみたりしましたが何も変わりません.ググってもそれっぽい情報は見つからないし・・・.うーん.

やっぱ当てずっぽうはダメですかねー.というわけで諦めて Emacs23 の src 以下を覗いてみることにしました.現象から察するに Emacs の中で文字の幅の計算を間違えているような雰囲気.とりあえず「width」とかでgrepをかけてそれっぽいファイルを・・・って src/xftfont.c にいきなり怪しいところが.

  if (INTEGERP (AREF (entity, FONT_SPACING_INDEX)))
    spacing = XINT (AREF (entity, FONT_SPACING_INDEX));
  else
    spacing = FC_PROPORTIONAL;

(中略)

  if (spacing != FC_PROPORTIONAL)
    {
      font->min_width = font->average_width = font->space_width
        = xftfont->max_advance_width;
      XftTextExtents8 (display, xftfont, ascii_printable + 1, 94, &extents);
    }
  else
    {

超あやしい.試しに printf を突っ込んでどこを通っているのか見てみたら spacing が FC_PROPORTIONAL になっていないようだったので,その直前で spacing に「FC_PROPORTIONAL」を設定してやったところ見事に設定通りの幅でフレームが表示されるようになったではないですか.いきなり到達するとは珍しい・・・.

しかし何だこりゃ.「spacing」自体は .fonts.conf で「0」に設定しているわけで (ちょうど globaladvance の無効化と一緒に設定してあった),/usr/local/include/fontconfig/fontconfig.h を見ると 0 は FC_PROPORTIONAL に相当するように見えます.

#define FC_PROPORTIONAL             0
#define FC_DUAL                     90
#define FC_MONO                     100
#define FC_CHARCELL                 110

が,Emacs 側で printf してみると spacing は 0 でなく「90」になってました.すなわち「FC_DUAL」・・・.なにそれ.「M-x list-fontsets」とかやってみると以下のように「p」でなく「d」と表示されるので確かに dual 扱いしているようです.

Fontset: -unknown-IPAゴシック-normal-normal-normal-*-16-*-*-*-d-0-fontset-auto1

どうして .fonts.conf で設定した情報がきちんと Emacs に伝わっていないのか・・・.次のエントリでその謎に迫ります.

お名前:  メールアドレス(省略可):
メールアドレスも表示されます
ここに名前その他を書いてはいけません: ここにメールアドレスその他を書いてはいけません:

2008年10月15日の日記の2番目の記事へのコメント

中の人情報

名前:
nosuke (のすけ)
メール:
sasugaanijaのgmail.com
「の」は「@」みたいな
関連リンク:

カレンダー

2008年10月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

<<先月分

翌月分>>

最新の10件のエントリ

最近の10件のコメント

過去ログ