2007年6月23日の日記の1番目の記事へのコメント
■uim.el と shifted-motion-keys-select-region
XEmacsでuim.elをONにするとシフト矢印で領域選択(Emacs的にはマークの活性化っていうんだっけ?)ができない問題ですが,対処に挑戦してみましたよ.
まず,ヒントを求めて previous-line の説明を見てみたところ,シフトキーを押してるときの挙動について書かれてました.この機能は shifted-motion-keys-select-region というらしいです.previous-line が定義されてる simple.el を見てみると,この中に shifted-motion-keys-select-region に関する記述も含まれてますなぁ.
shifted-motion-keys-select-region は handle-pre-motion-command や handle-post-motion-command という関数の中で使われている模様.この関数は lisp の方からではなく,src/event-stream.c の pre_command_hook や post_command_hook 関数で呼ばれているようです.うーん,この辺が呼ばれないから動かないのか.
というわけで,とりあえず uim.el の中で,uimがスルーしたキーを処理する前後に handle-pre-motion-command と handle-post-motion-command を挟んでやったんですが,状況は変わりませんでした.やっぱ世の中そう甘くはないですね(´・ω・`).
よく見ると,この辺の関数は中で last-input-event を見てシフトキーが押されてるかどうかを判定しているようです.uim.elでは,シフト+何かのキー にキーバインドが割り当てられていなかった場合,シフト無しで何かのキーが押されたことにしてキー処理をやり直すようになってます.というわけで,uim.el 内部でキーバインドを処理する時点で,last-input-event からはシフトが取り除かれてしまっていることになります.だからダメなのか?
ということは,シフトを取り除く前に,last-input-event の値をコピーしておいて, handle-pre-motion-command を呼ぶ際に last-input-event を値を元に戻せばいいはず.というわけで,早速 uim-original-input-event なる適当な変数を作って退避・復元処理を追加・・・してみたんですが,なぜか全然動きませんorz.値を見ると,uim-original-input-event の値がバリバリ変わってます.setq してるところを通らないのに変わるってどういうことなんだ・・・.
last-input-event の説明を見てみたら,なんと以下の記述が.
If you want to keep a pointer to this value, you must use `copy-event'.
うおー,これか!? 試しに (copy-event last-input-event) をsetqするようにしたらバッチリ XEmacsでシフト矢印が効くようになりました.わーい.そしてそのままcommit.まあ,この修正が誰かの役に立つことがあるのかどうかについては謎ですが,とりあえず直せてよかったっす・・・.
そういや,最近,家でLinuxとかUNIX系OS使ってる人と新規に出会うことが結構あるんですが,話の流れで「日本語入力何使ってんの?」と聞くと(この時点で相当キモいわけですがw),Anthy + uimという答えが意外と多くてひゃっほうな感じです.でも,uim.el を使っているかどうかまでは怖くて聞けません(笑)
2007年6月23日の日記の1番目の記事へのコメント
[コメントを書く]