Ikumi Keita
ikumi****@rever*****
2003年 7月 3日 (木) 00:51:01 JST
jrKanjiControl の動作について、ちょっとわからないことがあるので質問さ せてください。 【 概要 】 jrKanjiControl で、KC_DO によって CANNA_FN_Kakutei を行うと、確定文字 列が消えてしまうようだ。KC_DO で、確定文字列を消えないように確定操作を行 うにはどうしたらいいのか? 【 詳細 】 [Canna-dev 181]で触れた通り、私は emcws にちょっと手を入れて使っている のですが、canna.el の中で、「現在の候補を確定させて、未入力状態に戻る」 という処理を elisp から行いたくなりました。そこで、canna.c でそういう動 作を行う elisp 関数 canna-kakutei-now を追加して、それを elisp から呼ぶ ことにしました。 canna-kakutei-now の処理の主要部は jrKanjiControl(0, KC_KAKUTEI, (char *)&ksv); という形をしていて、これはちゃんと意図通りの動作をしてくれます(詳しく は、[Canna-dev 181]のパッチをご覧ください)。ここまではいいんです。 さて、もともと canna.c では、canna-do-function という elisp 関数が用意 されていて、「かんな」の動作は基本的にこれで制御できることになっています。 なので、本来は新しい elisp 関数を追加したりしないで、こちらで上の確定処 理を実現したいのです。ところが、elisp で (canna-do-function canna-func-kakutei) を評価すると、なぜか未確定状態だった候補文字列が確定しないで、全部消え去っ てしまいます(ちょうど、普通にかんなで入力をしていて、入力を C-g で取り 消したときのように)。なお、未入力状態には戻ってくれるので、その後の入力 には差し支えありません。 canna-do-function の処理の主要部は、canna.c 中で ksv.val = XINT (num); jrKanjiControl(0, KC_DO, (char *)&ksv); となっていて、elisp での引数 canna-func-kakutei の値を ksv.val に代入し て jrKanjiControl を KC_DO で呼ぶ、という処理になっています(なお、 canna.el 中にはもともと確定以外の処理で canna-do-function を呼ぶ部分がい くつかありますが、そこでは canna-do-function は意図通りの動作をしていま すから、canna-do-function 自体は正常に動作しています)。 canna-func-kakutei には CANNA_FN_Kakutei と同じ値がセットされていて、こ れは名称から言って確定処理を行う機能番号だと思うのですが、どうして確定文 字列が消えてしまうのでしょう? なお、念のため、上記自作関数 canna-kakutei-now の処理を /* jrKanjiControl(0, KC_KAKUTEI, (char *)&ksv); */ ksv.val = CANNA_FN_Kakutei; jrKanjiControl(0, KC_DO, (char *)&ksv); のように変えてみても、やっぱり確定文字列が消えてしまう、という症状が発生 します。 というわけで、jrKanjiControl で KC_DO を行うとき、どうすれば確定文字列 を消さずに済むのでしょうか?というのが聞きたいことです(ひょっとしたら、 jrKanjiControl で KC_DO を行うときの「かんな」側の処理に何か不具合がある んじゃないか、という点もちょっと疑っているのですが…)。 ※ なお、はずかしながら C 言語を実は全然知らないので、canna.c は勘と見よ う見まねでいじっています。もし、全然見当外れのことを書いていたりしたらご めんなさい。 井汲 景太