Ikumi Keita
ikumi****@rever*****
2003年 1月 17日 (金) 00:21:04 JST
井汲です。 > C-yの方は、emacs側の問題だとは思うのですが、elispが分からないので、原 > 因究明には挫折してます。 私は、以下のような理由で、問題があるのはかんな側だろう、と推測していま す。 まず、基礎となる事実は、 [A] C-y を2回以上叩いて確定すると、品詞解釈情報は表示されっぱなしで、 消えない。 [B] しかし、C-y を1回だけ叩いて確定すると、品詞解釈情報の表示は消える。 の2点です。これは、emacs でも kinput2 でも共通しています。 とりあえずこの点を考察することにして、生のコントロールコードが emacs のバッファに挿入されてしまう件は切り離して後で考えましょう。 まず、[B]が正常な動作と考えられますが、こうなるのは、確定時に「かんな 内部で保持されている読みや候補の情報はなくなって、まっさらの未入力状態に 戻った」ということが Canna client 側に伝えられて、client が自主的に表示 を消すから、ですよね。 それと比べると、[A]は「かんなが未入力状態に戻った」にもかかわらず、そ の情報が client に正しく伝わっていない、ということを示唆しています。さら に、 [A'] C-y を2回叩いた後、確定する代わりに C-g を連打して未入力状態に戻し ても、もうそこには残っていない文節に対する品詞解釈情報が表示されっ ぱなしになる(これも、emacs・kinput2 共通) ということから、問題はかんな側にあって、「本来捨て去られるべき品詞解釈情 報が、誤って client に伝えるべき情報として残り続けている」のではないでしょ うか。 つまり、かんなの内部状態が不整合を起こしていて、「未入力状態に戻ったに もかかわらず、それを client に伝えるべき変数が正しい値になっていない」と いうのが私の推測です。 この推測が正しいとすると、emacs に生のコントロールコードが挿入されてし まう理由も説明がつきます。 [A]の後、emacs には「未入力状態に戻った」ということが伝わっていないの で、emacs はまだ入力途中の状態だと思い込んでいます。ですから、キーボード からコントロールコードの入力を受け取ると、それをそのままかんな側に渡しま す。 しかし、かんな側は受け取ったコントロールコードの使いみちがまったくない ので、それをそのまま「確定文字列」として emacs に返します(これは、特に 異常が発生していないときでも、未入力状態でスペースキーを叩いたとき起きる 現象と同じです)。その結果、emacs は「確定文字列」と信じたコントロールコー ドを律義にバッファに挿入していくのです。 そして、kinput2 でもまったく事情は同様なのだと思います。ただ、例えば kterm に対して kinput2 で入力しているとき、「確定文字列」として C-a など が伝えられる、ということは、結局 kterm 内で動いている shell に C-a が伝 えられる、ということであり、普通に C-a をキー入力したのと同じ結果になるの でしょう。すなわち、今度の問題はたまたま emacs で顕在化しただけであって、 実際はすべての Canna client に共通している、というのが私の推測です。 なお、emacs+emcws にかんなで日本語を入力するときの canna.el の動作につ いて、私の理解しているところの概略は以下の通りです。 (1) emacs がキーボードからコントロールコードの入力を受け取ったとき、その 処理については次の2通りの可能性がある。 [1] emacs 自身の編集コマンド(カーソル移動や文字削除等)に用いる [2] かんなに渡す (2) [1][2]のどちらにするのか、は、canna-empty-info という emacs lisp 変 数の値に応じて決まる。emacs は、かんなに処理を依頼するたびにこの変数 をチェックし、その結果に応じて次の入力を [1] とするか [2] とするかを 決定する。 (3) かんな側の処理の後、canna-empty-info が ・ t ならば、かんなが未入力状態に戻った、と emacs は判断し、次の入力に 対しては[1]になるようにキーマップを整える。 ・ nil ならば、かんなへの入力はまだ途中である、と emacs は判断し、次の 入力に対しては[2]になるようなキーマップを用いる。 (4) canna-empty-info の値は、canna.c の中で、jrKanjiString の呼び出しの 後 Vcanna_empty_info = (ks->info & KanjiEmptyInfo) ? 1 : 0; として設定される。canna-empty-info は、canna.el の中では参照しかされ ず、値は変更されない。 ですから、emacs の動作については、 > revpos,revlenに0が渡る というのはたぶん本質ではなくて、「未入力状態に戻ったにもかかわらず、 canna-empty-info が t にならない」というのが問題なのだと思います。 井汲 景太