Masanari Yamamoto
h0131****@ice*****
2005年 12月 31日 (土) 03:47:17 JST
山本です。 最近、gvimでuim-ximを使えるようにするにはどうすればいいのか調査してい ます。 1 gvim-gtk2 + im-xim + uim-xim set imactivatekey= のようにimactivatekeyを空にしておけばとりあえず使えます。 ただし、ノーマルモードに移行しても自動的にdirect modeにはなりません。 set imactivatekey=s-space の状態で、s-spaceを入力すると入力モードは切り替わりますが(anthyの場合 「あ」と表示される)、アルファベットしか入力できません。 s-spaceが入力されてIMがonになったとき、gvimはXIM_PREEDIT_STARTが送られ ることを期待していますが、uim-ximの場合XIM_PREEDIT_STARTはプリエディッ トが開始されたときに送られるため、gvimはIMがonになったことを認識しない ためです。 set imactivatekey=x imactivatekeyが空でないときに、C-^を入力するとgvimが固まり、uim-ximは unknown type of forwarded event.(0)と出力します。 gvimはC-^が入力されるとimactivatekeyの値を gtk_im_context_filter_keypressでimmoduleに送ります。この処理はmbyte.c のim_synthesize_keypress内で行われますが、この中でevent->send_event = TRUE; のようにsend_eventフラグをTRUEにしています。Xlibの実装がおかしいような 気がするのですが、send_eventがTRUEになっているとXIMサーバが受け取る xEventのu.u.typeが0になってしまいます。そのため、uim-ximはどのイベント が発生したのか分からないのです。 2 gvim-gtk1 + uim-xim set imactivatekey= imactivatekeyが空のときは、C-^が入力されるとgvimはXNPreeditStateを使っ てIMのon/offを行います。uim-ximはXNPreeditStateに対応していないので、 C-^を入力したあとs-spaceを入力する必要があります。 set imactivatekey=x imactivatekeyが空でないとき、C-^が入力されるとgvimはXSendEventを使って imactivatekeyの値を自分に送ります(mbyte.cのim_xim_send_event_imactivate)。 この場合も上と同じようにunknown type of forwarded event.(0)と出力され てgvimが固まります。 まとめとして、gvimでuim-ximを便利に使えるようにするためには、 XIM_PREEDIT_STARTとXIM_PREEDIT_DONEをIMのon/offに合わせて送る。 XNPreeditStateに対応する。 send_event = TRUEのときの対処 が必要です。 -- 山本将也