[Anthy-dev 1104] uim_get_default_im_name()の選択アルゴリズム

アーカイブの一覧に戻る

YamaKen yamak****@bp*****
2004年 9月 30日 (木) 20:18:04 JST


ヤマケンです。

個人間のやり取りでちょこちょことバグ報告を頂いてたんですが、だん
だん私が突っ込んだ実装について解説が必要になってきたんで公開MLに
場を移してみます。

At Thu, 30 Sep 2004 19:15:58 +0900,
ekato****@ees***** wrote:
> 
> On 2004/09/30, at 18:07, YamaKen wrote:
> 
> > r1372で直しました。あまりのショボさにクラクラしてきました。
> > …backtrace便利ですね。
> 
> 直りました。おつかれさまです。
> 
> で、これで気づいたのですが、このアルゴリズムどうなっているのでしょう?
> コード見てないのですが、LANG=en_US だと、pinyin-big5 が選択されていて
> LANG=C だと ipa になっているようです。uim の IM にデフォルトで無い言語の
> 場合 "default" が選ばれるほうがいいような気がちょっとします。
> 
> この理由などで、uim-xim ではとりあえず uim_get_default_im_name() を
> 使わなかったというのも、そういえばありました。


以下のような環境で開発しているんですが、

$ uim-sh
uim> (map car im-list)
(m17n-zh-py m17n-vi-viqr m17n-vi-telex m17n-th-kesmanee m17n-te-itrans m17n-ta-itrans m17n-sr-kbd m17n-sl-kbd m17n-ru-yawerty m17n-pa-itrans m17n-or-itrans m17n-ml-itrans m17n-lo-lrt m17n-ko-hangul2 m17n-kn-itrans m17n-kk-kbd m17n-kk-arabic m17n-ja-tcode m17n-ja-anthy m17n-hr-kbd m17n-hi-itrans m17n-he-kbd m17n-gu-itrans m17n-ar-kbd m17n-el-kbd m17n-bo-wylie m17n-bn-itrans m17n-as-itrans m17n-am-sera pinyin-big5 pyunihan py ipa romaja hangul3 hangul2 viqr skk tutcode canna prime anthy tcode default)

確かにlocaleがen_USとCの場合の実行結果はおかしいです。

uim> (im-name (find-default-im "ja_JP"))
m17n-ja-tcode
uim> (im-name (find-default-im "en_US"))
m17n-zh-py
uim> (im-name (find-default-im "C"))
ipa

順番に動作を解説します。

まずen_USの方ですが、現在はim-langがenのIMが存在しないため、
fallbackしてcurrent-imが使われています。現在の実装ではcurrent-im 
の初期値はim-listの先頭なので、たまたま先頭にあるm17n-zh-pyが使
われます。

uim> (im-name current-im)
m17n-zh-py

加藤さんのおっしゃるようにここはdefault IM('default'という名前の
何もしないIM)を返すようにすべきですね。ただ、以前から存在してい
るcurrent-imとswitch-imを使ったキーボード操作によるIM切り換え機
構との整合性を保つために、最終的なfallback先はcurrent-imのままで、
default IMのlangをenに変える事でマッチするようにしようと思います。
本来はこのcurrent-imという機構自体が見直しの時期に来ていると思い
ますが、削除するにもまた一悶着が必要なので今回のリリースではその
まま維持したいと思います。

次に"C" localeでipaが選ばれる動作ですが、これは今日導入した
locale objectの動作にとipa IMのlang情報に原因があります。

通常のlocale objectは以下のように初期化されるんですが、

uim> (locale-new "en_US.US-ASCII")
("en" "US" "US-ASCII")
uim> (locale-new "en")
("en" "" "")

CやPOSIX localeの事を忘れて「lang部が2文字である事」というチェッ
クを入れてしまったので、不正と見なされた"C"は空文字列として初期
化されています。

uim> (locale-new "C")
("" "" "")

一方、ipa IMはregister-im時にlangを""として登録しているので、

uim> (im-lang (retrieve-im 'ipa))
""

「""というlocale向けのIM」という検索に引っ掛かってしまいます。こ
のため"C" localeに対してはipa IMが選択されてしまっていました。

(im-name (find-default-im ""))
ipa

原因は分かったので後程修正してcommitしておきます。報告ありがとう
ございました。

-------------------------------
ヤマケン yamak****@bp*****



Anthy-dev メーリングリストの案内
アーカイブの一覧に戻る