2006年2月15日の日記を表示中

2006年 2月 15日 (水)

uim.elとEmacs-22.0.50

Emacs22だとundoがおかしくなる問題を追ってみました.どういうわけかuim.elでは プリエディット表示 → Enterで確定 した際に,buffer-undo-listに,commitされた範囲とあわせてcommit後のカーソル位置が入ってしまい,undoするとcommitしたところが消えた上で,カーソルが変なところに飛びます.Emacs21だとこんな現象は無いわけで・・・.手で関数呼んでinsertした場合は普通.anthy.elでも無問題.うーん.

外から叩いてもよくわからんので,Emacs22のソースを見てみることに.editfns.cにinsertの定義が書いてあって,追っていくと insdel.cの insert_from_string が呼ばれてて,その中で insert_from_string_1 が呼ばれてます.で,こん中で undo.c にある record_insert ってのがさらに呼ばれてて,これがinsertが呼ばれたときに buffer-undo-list を更新する関数っぽい感じ.

record_insert の中を見ると・・・Emacs22ではEmcas21と違ってrecord_pointというのを呼んでいるではないですか.record_point は条件次第でカーソル位置(point)とかをbuffer-undo-listに記録する関数のようです.見てみると,last_point_position ってのが現在のカーソル位置と違うときに,last_point_position の方がbuffer-undo-listに登録されるようになってます.

で,こっからは適当.どうも last_point_position はコマンドループの最初の方で,その時点でのpointが設定される模様.ということは,キーが押された瞬間のpointが設定される? とすると・・・

  1. 「aiueo」と入力
  2. プリエディットとして「あいうえお」と表示され,カーソルは「お」の後に
  3. Enterを押すとコマンドループが開始して「お」の後のカーソル位置が last_point_position に入る(多分)
  4. プリエディットを消すとpointが「あ」があった位置になる
  5. 確定文字列の「あいうえお」をinsertすると,この時点で point と last_point_position の値が違うため,last_point_position がbuffer-undo-listに追加されてしまう

ということですか? でも,同じことはanthy.elでも起こり得るはずなのに,なんであっちは平気なのか.・・・あー,なるほど.anthy.elではinsertしてる間は buffer-undo-listを更新しないようにしていて,inesrt後に,buffer-undo-list に手でundo用の記録を追加してますね.なるほど,だから起こらんのか・・・って,ここ書いたの漏れですか(;´Д`)?

というわけで,uim.elでもcommitされた文字列のinsert分は,手でbuffer-undo-listに追加するように変更して問題回避したつもり.いやー,疲れました( ´Д`)=3

[コメントを書く]

nosuke 2006/02/18(土) 03:12:18
どひゃー,うまくいってなかった.というかanthy.elではたまたま
うまくいっていた予感!

2006年2月15日の日記を表示中

中の人情報

名前:
nosuke (のすけ)
メール:
sasugaanijaのgmail.com
「の」は「@」みたいな
関連リンク:

カレンダー

2006年2月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28        

<<先月分

翌月分>>

最新の10件のエントリ

最近の10件のコメント

過去ログ