2007年10月20日の日記の1番目の記事へのコメント
■uim.elのsit-for問題
とりあえず uim-process-input 全体をちゃんと unwind-protect するようにしました.で,その上で sit-for を呼ぶところで inhibit-quit を t に・・・.って,これでうまくいくのはEmacs-22だけか(;´Д`)
Emacs21だと sit-for してる間に C-g が押されて keyboard-quit が実行されると,その間 inhibit-quit していて最後に quit-flag をnilにしたとしても,[7] を拾うことができません.なので,Emacs-21でuim.elをONにしている場合,「C-x」と打ってすぐに「C-g」と打つと『「C-x C-g」が未定義だ』というエラーではなく,『「C-g」で入力がキャンセルされた』という動作をします. uim.el が OFFだと,どっちも 『「C-x C-g」が未定義だ』になるので,これに合わせたいわけですが.
Emacs22のsit-forの実装を見たら,中で read-eventを使ってたので,uim.elでもsit-forを使わずに直接read-eventを呼べば・・・と思ったら入力待ちの秒数指定できるのはEmacs22からでした(´・ω・`)
何か代わりになるものはないかと探したら,with-timeoutなんていうマクロを発見.が,結局 read-event の中で「C-g」を叩くと,[7] を拾えずに中断しちゃいます.どうやったら[7]を拾えるんだー.read-key-sequence-vector では拾えるので,何かあると思うんですが・・・.あ,read-key-sequence-vector 使えばいいんじゃね?
というわけで,FSF Emacsについては,read-key-sequence-vector で拾ったキーを unread-command-events に突っ込むことで sit-for を使うのをやめることに成功しました.(define-key global-map [24 7] 'beginning-of-line) とかやってもちゃんと動きます(笑) ↓こんな感じ
(when (setq key (with-timeout (echo-keystrokes nil) (read-key-sequence-vector nil))) (setq unread-command-events (nconc (listify-key-sequence key) unread-command-events)))
ちなみに,XEmacsでは,「C-x」を叩いてから echo-keystrokes 秒経過する前に「C-g」を叩くと keyboard-quit になるのに,「C-x」を叩いてプロンプトが出てから「C-g」を叩くと「C-x C-g」にバインドされたコマンドを実行しようとします.つまりさっきまでの uim.el と同じ状態.うーんいいのかそれで.というわけでXEmacsの方はsit-forのまま.
2007年10月20日の日記の1番目の記事へのコメント
[コメントを書く]