[Canna-dev 212] KC_DO behaviour with CANNA_FN_Kakutei

Back to archive index

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 は勘と見よ
う見まねでいじっています。もし、全然見当外れのことを書いていたりしたらご
めんなさい。

							井汲 景太



Canna-dev メーリングリストの案内
Back to archive index