2007年8月9日の日記の3番目の記事へのコメント

uim.el

これを組み込んだところ,たまに this-command-keys の実体が keyvec のまま残ってしまい,Emacsがまともに操作できなくなって (゜д゜)マズー な現象が時々発生するようになってました(これとかこれとか).

再現条件がよくわからない上に忙しいときに限って出先で出たりするもんで,なかなか手をつけることができず放置してたんですが,たまたま一昨日くらいに家のT60で発生.これはチャンスとそのままおかしくなったEmacsを安置し,本日uim.elのデバッグメッセージを回収して調査してみました.

とりあえず,いきなりフォーカスが「*Backtrace*」に移っているポイントを見て,どの辺で発生したのか当たりをつけ,そのちょっと前を詳細に見てみたところ,「M-x」とか「C-x o」を押しつつ,途中別のアプリにフォーカスが移って,uim-helper-agentからフォーカスが外れたことを示すメッセージを受け取って発生しているような雰囲気です.ふーむ.

これを元に,まず同じことをやって見たところ,再現することを確認.よし.で,これならどうだ,と絞り込んでいった結果,最終的にこんだけで発生することが確認されました.

  1. Emacsを起動して C-o で uim.elをONにする
  2. M-x を押す
  3. C-o でミニバッファ内でuim.elをOn
  4. C-a を押す
  5. C-g を押す

ここまでやった状態で, C-s を押してインクリメンタルサーチにして C-aを押したりすると, this-command-keys に設定されてる keyvec なんてないぞとか言われて引っかかります.

「何かキーが押されて,uim-el-agentにキーを渡したけど,uimがスルーした」場合,戻ってきたキーをuim.elがどうにかして処理しているわけですが,C-x C-h みたいなヘンテコなのに対応するために,戻ってきたキーにバインドされているコマンドを実行する前に,this-command-keys 関数をすり替える処理を行っています.

が,M-x に バインドされている execute-extended-command のような,ユーザからの入力を待つタイプのコマンドの場合,呼び出すと,ユーザの入力が終わるまで関数が返ってきません.そのため,this-command-keys 関数がすり替えられたままの状態で,再度「何かキーが押されて,uim-el-agentにキーを渡したけど,uimがスルーした」という状況が発生してしまいます.M-x を押した後,C-o を押して C-aを押したのがまさにこの状態.

これが起こると,偽物にすり替えられている this-command-keys を,本物だと思って更に偽物にすり替えることになります.で,ここからは,本当かどうか怪しいところなんですが,多分,そうなると,2回目にすり替えた際に本物だと思って大事に確保した偽物が,1回目に確保した本物を上書きしてしまう模様.これにより,execute-extended-command とかから戻ってきたところで,this-command-keys には偽物が戻されてしまうことになり,上記のようなエラーが生じてしまう,と・・・.

さて,どうやって直したものか.とりあえず本物の退避先をローカル束縛(使い慣れない言葉で恐怖を感じる)な変数にしないで,リストにして,スタックっぽい使い方してみたんですが,うまく動かず(´・ω・`).仕方ないので,退避は最初の1回だけに限るようにして,多重で呼ばれたときは,どんどん偽物で上書きするだけにしたら直りました.が,何か違和感を感じます.何か微妙な.まあ,そもそもfsetで一時的にすり替えてること自体が相当微妙なわけですが・・・.

お名前:  メールアドレス(省略可):
メールアドレスも表示されます
ここに名前その他を書いてはいけません: ここにメールアドレスその他を書いてはいけません:

2007年8月9日の日記の3番目の記事へのコメント

中の人情報

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

カレンダー

2007年8月
      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 29 30 31  

<<先月分

翌月分>>

最新の10件のエントリ

最近の10件のコメント

過去ログ