論理演算
Emacs でことえり入力をする時に、カーソルがピコピコする問題があるそうです。自分は ddskk を使っているので気がつきませんでした。スラドのはいろむさんが言及している部分が論理演算のようなことをしていたので、勉強のために真理値表とにらめっこしながら表を作ってみることにしました。
対象となるのは keyborad.c の次の部分。否定、論理積、論理和、括弧での優先度が出てきています。ぱっと見、何をしたいのかわからん。
while (!(input_pending && (input_was_pending || !redisplay_dont_pause)))
組み合せは 8 通りなので、表を作って書き込んでみます。
! | and | input_pending | or | input_was_pending | ! | redisplay_dont_pause |
---|---|---|---|---|---|---|
F | (T) | 真 | (T) | 真 | F | 真 |
F | (T) | 真 | (T) | 真 | T | 偽 |
T | (F) | 真 | (F) | 偽 | F | 真 |
F | (T) | 真 | (T) | 偽 | T | 偽 |
T | (F) | 偽 | (T) | 真 | F | 真 |
T | (F) | 偽 | (T) | 真 | T | 偽 |
T | (F) | 偽 | (F) | 偽 | F | 真 |
T | (F) | 偽 | (T) | 偽 | T | 偽 |
1 | 2 | 3 | 4 | 5 | 6 | 7 |
- 2 の否定(最終的な while への値)
- 3 と 4 の論理積
- input_pending の値
- 5 と 6 の論理和
- input_was_pending の値
- redisplay_dont_pause の値の否定
- redisplay_dont_pause の値
表を作ってみたけれど、やっぱり何をしたいのかわからん。もともとの while の判定は次のようになっていて、
while (!input_pending)
変更した意図は「input_was_pending が偽、redisplay_dont_pause が真の時に今までの挙動とは変えたい」ということになります。そしてちょうどこのケースがインプットメソッドでの入力に不具合を生じさせてしまったと。
他への影響はわからないけれども、ピコピコを避けるには while への値が偽になっていて欲しいわけなんですよね。
とりあえず次のようにしておけば、これまでと同じような挙動になりそうです(T になるのは偽偽真の時だけ?)。
while (!(input_pending || (input_was_pending || !redisplay_dont_pause)))
実際にビルドしてみると、入力時にピコピコしなくなったものの、変換を確定してから次の文字を入力する時に少し(いや、かなり)引っ掛りを感じる動きになってしまいました。さっぱりわからん。
ちなみに次のようにすると、ピコピコしないし確定後の入力でも引っ掛ることもないし、キーリピート(入力・移動)でも問題なかったりします。
while (!(input_pending || (input_was_pending && !redisplay_dont_pause)))
冒頭で書いたように、自分は ddskk を使っているので不具合が解消しなくても問題がないのですが、実験を繰り返しているうちに気になるようになってしまいました。ということで、一番最後のケースを採用して、先日の修正と合せて Emacs をビルドして使うことにしました(論理的に間違ってますけどね)。
触っているのは画面の書き換えについてだけですし、バッファの内容まで消えてしまうことは無いでしょう。まぁ私には Vim もありますし気楽なものです。