2008年10月15日の日記を表示中

2008年10月15日 (水)

alt-cannadic-081012のextraをuim.elで使ってみた

昨日の続き.Emacs22 でちょっと試してみたんですが UTF-8 で uim 側とやりとりすると記号の大きさが変で変換候補の表示幅がおかしかったり確定した後のバッファを SJIS や EUC-JP で保存できなかったりとフォント以前に色々と変だったので早々に諦めて Emacs23 の上で試してみることにしました.

とりあえず Emacs23 を普通に CVS から引っ張ってきてビルドしたところ,セグって全く起動する気配がありません.「Fatal error」でも何でもいいから落ちた理由くらい教えてくれ (´・ω・`)

gdbで見て落ちているところをキーワードにググってみたらこれがヒット.あー,fontconfig が古いのか.見てみたら T60 の環境の fontconfig は 2.3.94 だとか.こりゃ古そうだ(笑).というわけで fontconfig を 2.6.0 にアップデート・・・しようとしたら freetype が古くてついてこれなかった (2.1.10だった) のでこっちもついでに 2.3.7 にアップデート.これでセグらずに Emacs23 が起動するようになりましたよ.よしよし.

で,.emacs に Emacs23 用の設定を加えてIPAゴシックを使うようにしたりEmacs22以下では anthy-utf8 を使わないように細工したり (ここでuim.elのしょぼいバグを見つけたりしてcommitしたorz) していざテスト.お,とりあえず uim.el 経由で「!!」を変換すると「‼」が表示されますな.確定もできる.何かIPAゴシックじゃないフォントみたいですが (IPAフォントを最新のに上げたら直りました) ひとまず uim.el でもいけそうな感じです.

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 に伝わっていないのか・・・.次のエントリでその謎に迫ります.

Emacs23のフレーム幅が直った

・・・といきたいところだったんですが,先に「spacing」に注目して色々試してみたところ謎に迫ることなく回避策が見つかってしまったので深追いするのはやめにしちゃいました.見つかった回避策はこれ.

  • 「(set-default-font "IPAGothic-16:spacing=0")」のように,Emacsで使いたいフォント名の後ろに「:spacing=0」をつけておく (0でなく100や110でもなぜか平気)
  • .fonts.conf とかでそのフォントの spacing を 0 にしておく

こんだけです.IPAフォントに限った話なのかもしれませんが,どっちかだけだとダメでした.

というわけで,以下は Emacs23 + anthy-9100e + alt-cannadic-081012 + uim.el (trunk-r5595) で色々変換してみたところ.とりあえず変換候補の位置が正常になりましたよ,と.

「‼」

みんなが大好きな「まるきゅう」.「⑨」以外なぜかボコボコ.別のフォントになっている?

「⑨」

「⊕」は何か幅が変だな.

「⊕」

ていうか「波ダッシュ」と「全角チルダ」の見分けがつかないのですが (;´Д`)

「~」

それと,これまたよくわからんのですが,さざなみフォントとかVLゴシックを使う場合は「(set-default-font "VL Gothic-16:spacing=100")」みたいに「100」にしとかないとフレームの幅が直ってくれませんでした.しかもこれらフォントの場合は .fonts.conf に spacing を設定しなくても大丈夫っぽい.フォントまわりは相変わらず奥が深い症候群.

というわけで,とりあえず使えることを確認するだけのはずだったのになぜか脱線してこんなことになってしまったというお話でした・・・.しかしこんだけハマったのにググっても同じような話題が見当たらないってのがすごいですね.・・・ひょっとして一人思いっきり間違ったことしてたりするのかな・・・ま,いいか (´∀`)

おまけ: 「t」をくっつけて変換する方法は .uim に以下のように書いとけばいいんじゃないかと (何か足りなかったらごめん)

(require "japanese.scm")
(define ja-rk-rule
  (append  '(
            ((("t") . ()) ("t" "t" "t"))
            )
           ja-rk-rule))

雷電IV

日付も変わろうかという頃にようやく開封.とりあえずデフォルトの家庭用モード(?)を数回遊んでみました.初見で3ボスに到達するも,その後はスコアが伸びるだけで3ボスが全然倒せず疲れて終了.途中1回アーケードモードを難易度アーケードでやったら2ボスで死んだ(笑).やめちまえってくらいにセンスが無くて泣けます orz

2008年10月15日の日記を表示中

中の人情報

名前:
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件のコメント

過去ログ