2007年10月20日の日記を表示中

2007年10月20日 (土)

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日の日記を表示中

中の人情報

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

カレンダー

2007年10月
  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件のコメント

過去ログ