2007年6月3日の日記の3番目の記事へのコメント
■uim.el
やっぱ今まで通り,全部uim.elが吸い込んで自前で処理する方向でいきますわ.「何かおかしいぞ」という部分は,指摘があったらその都度対処することにしよう.誰も使ってないところを一生懸命作り込んでもしょうがないしね・・・あ,だったらXEmacsのサポ(ry
で,help-char判定をuim.el側でやってみたんですが,簡単と見せかけて実は相当面倒くさいこと判明.とりあえず prefix-help-command にデフォルトで設定されている describe-prefix-bindings 関数は,中で this-command-keys を呼んでるんですが,この関数,Cで書いてあって,関数が返してくる値をlisp側から書き換える方法が無いっぽい・・・(;´д`).だもんで,ここは fset と symbol-function を使って関数そのものを一時的に差し替えるとかそんなのをやることにしました.↓こんな雰囲気.keyvecはuim.elが横取りしたキーベクトル.
(let (this-command-keys-original (mode uim-mode)) (fset 'this-command-keys-original (symbol-function 'this-command-keys)) (unwind-protect (progn (fset 'this-command-keys '(lambda () keyvec)) (setq uim-mode nil) (funcall prefix-help-command)) (progn (fset 'this-command-keys (symbol-function 'this-command-keys-original)) (setq uim-mode mode))))
ちなみに,↑の外側でやってる help-charかどうかの判定は↓な感じ.「keyvecの最後はhelp-charですか?」ということを調べたいだけなのに,XEmacs側はなぜこんなことになってしまうのかと・・・_|‾|○
(or (and uim-emacs (= help-char (aref (uim-last-onestroke-key keyvec) 0))) (and uim-xemacs (equal (uim-xemacs-make-event (uim-convert-char-to-symbolvector (key-description help-char))) (aref (uim-last-onestroke-key keyvec) 0))))
上記を追加したことで,C-x C-h とかを横取りした際にちゃんとC-xのヘルプが表示されるようになりました.ふぅ・・・.
が,テストしてるうちに,上記対策をとると FSF Emacsの方で f1 C-h した際に,uim.elがONだと「You have typed <f1>」の「<f1>」の部分が表示されないことが判明.help-macro.elを読むに,この部分は this-command-keys から生成しているんで,上記変更で問題ないはずなのになぜ?と思って追ってみたら,f1 C-h には help-for-help なるコマンドがバインドされてました・・・.何この統一性の無さは.というわけで,this-command-keys を差し替える処理を他数ヶ所にも埋め込み,こちらも一応解決.特に問題なさそうだったんでcommit.
ちなみに,XEmacsでシフト矢印が効かない問題は未解決だったり.これまたソース追わないとわからなそうで・・・.トホホ.
2007年6月3日の日記の3番目の記事へのコメント
[コメントを書く]