朝令暮改たまごです。
ftp://ftp.jpl.org/pub/tmp/egg-its-1.17-199907011017.patch.gz
ftp://ftp.jpl.org/pub/tmp/egg-its-1.17-pkg-199907011017.tar.gz
>>>> In <28oghxqngl.fsf(a)kchisa.ga.sony.co.jp>
>>>> Katsumi Yamaoka <yamaoka(a)ga.sony.co.jp> wrote:
山岡> 新しい menu 機構を使う場合に、いくつかのキーで minibuffer に文字
山岡> をinsert できてしまうので、それらを `ignore' に bind するなどし
山岡> てみました。
これでは mouse event などには対応できませんでした。Elips ML で守岡さん
や片山さんのご協力を得て、まともな方法で解決することができたので、改め
て archive し直しました。
簡単に書きますと FSF Emacs では
(setq KEYMAP (make-sparse-keymap))
(define-key KEYMAP [t] 'ignore)
とすることで default の binding を関数 `ignore' にすることができますが、
XEmacs では KEYMAP が keymap という object であって FSF Emacs のような
list ではないため、ほとんどの場合上記の方法は通用しません。
XEmacs ではこれに代わって `set-keymap-default-binding' を使います。
(set-keymap-default-binding KEYMAP 'ignore)
しかし、こうして作った KEYMAP を普通に `use-local-map' する場合は何も
問題無いのですが、Egg の menu では `read-from-minibuffer' の第 3 引数
を介して minibuffer に渡すときに
(use-local-map (copy-keymap KEYMAP))
のようなことが行なわれるため (*) default binding が継承されません。
そこで、今回は minibuffer-setup-hook を使って、copy された後の keymap
に対して
(set-keymap-default-binding (current-local-map) 'ignore)
を行なうようにしました。
(*) 実際は help.el の関数 `help-keymap-with-help-key' の中で copy
されます。
;; このように minibuffer の keymap を改変する場合は後で元に戻さなけれ
;; ばならない、と初めは思っていたのですが、そういうことは不要でした。
以上の改造によって egg.el はかなり良い出来に仕上がってきたと思うのです
が、xemacs-patches に出すのは少し遅らせようと思います。
と言うのは keymap を copy するときに
(let ((default-binding (keymap-default-binding KEYMAP))
(new-keymap (copy-keymap KEYMAP)))
(set-keymap-default-binding new-keymap default-binding)
(use-local-map new-keymap))
とでもするように XEmacs の方を改造すべきだと思うからです。
--
Katsumi Yamaoka <yamaoka(a)ga.sony.co.jp>