2006年2月15日の日記の1番目の記事へのコメント
■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が設定される? とすると・・・
- 「aiueo」と入力
- プリエディットとして「あいうえお」と表示され,カーソルは「お」の後に
- Enterを押すとコマンドループが開始して「お」の後のカーソル位置が last_point_position に入る(多分)
- プリエディットを消すとpointが「あ」があった位置になる
- 確定文字列の「あいうえお」を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
[コメントを書く]
2006年2月15日の日記の1番目の記事へのコメント
うまくいっていた予感!