[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: keymap for article buffers of MUA
>> On Wed, 23 Oct 2002 12:06:55 +0900
>> 「土」== tsuchiya@pine.kuee.kyoto-u.ac.jp (TSUCHIYA Masatoshi) said as follows:
土> 例えば,mime-w3m-mode-map を変更したいユーザーは,何処に設定を書け
土> ば良いのでしょうか.この場合,(eval-after-load "mime-w3m" ...) で
土> も駄目,というのが深刻です.今の構造だと,mime-w3m-setup-hook を新
土> 設するしか対処方法が思いつけません.
とにかく,現状では「mime-w3m-mode-map をカスタマイズすることが事実上不
可能」なので,何とかしないといけません.
;; 確実に反映させるには,mime-w3m-setup に before advice を定義する,
;; くらいしかないんじゃないかな.
解決策ですが,『w3m-minor-mode-map を復活し,Emacs20 以前については毎
回 copy-keymap を呼び出すことによって local-map を模擬する』という実装
を思いつきました.部分的なパッチを以下に示します.
--- mime-w3m.el 22 Oct 2002 13:55:40 -0000 1.45
+++ mime-w3m.el 23 Oct 2002 06:58:44 -0000
@@ -145,8 +145,16 @@
(string-match "\\`http://" xref)
xref))
(add-text-properties p (point-max)
- (list 'local-map mime-w3m-mode-map
- 'text-rendered-by-mime-w3m t)))
+ (nconc
+ (if (or (featurep 'xemacs)
+ (>= emacs-major-version 21))
+ (list 'keymap
+ w3m-minor-mode-map)
+ (list 'local-map
+ (let ((map (copy-keymap w3m-minor-mode-map)))
+ (set-keymap-parent map mime-view-mode-default-map)
+ map)))
+ '(text-rendered-by-mime-w3m t))))
(error (message (format "%s" err))))))))
;; To avoid byte-compile warning in `mime-w3m-cid-retrieve'.
この方法の優れている点は,何よりも分かり易いことです.~/.emacs-w3m の
中に (define-key ...) を記述すれば,ライブラリの読み込み順序に関係なく
確実に反映されます.
欠点は,copy-keymap() の overhead でしょう.キーの変更という操作は,そ
れほど頻繁に行われるわけではありませんから,変更されているわけでもない
のに新たな keymap のメモリを毎回消費するというのは,少し悲しいものがあ
ります.ただし,w3m-minor-mode-map は,デフォルト状態では11 しかキーが
割り当てられていない非常に小さい keymap ですから,overhead はさほどで
もない,という予想もあります.
もちろん,tmp-keymap に待避しておいて変更があったら追従する,という解
も可能です.その場合は,以下のようなコードになります.
--- mime-w3m.el 22 Oct 2002 13:55:40 -0000 1.45
+++ mime-w3m.el 23 Oct 2002 07:22:49 -0000
@@ -119,6 +119,8 @@
(font-set-face-background 'default color (current-buffer))))
(cons 'progn body)))
+(defvar mime-w3m-mode-tmp-map nil)
+
;;;###autoload
(defun mime-w3m-preview-text/html (entity situation)
(mime-w3m-setup)
@@ -145,8 +147,23 @@
(string-match "\\`http://" xref)
xref))
(add-text-properties p (point-max)
- (list 'local-map mime-w3m-mode-map
- 'text-rendered-by-mime-w3m t)))
+ (nconc
+ (if (or (featurep 'xemacs)
+ (>= emacs-major-version 21))
+ (list 'keymap
+ w3m-minor-mode-map)
+ (list 'local-map
+ (progn
+ (unless (and mime-w3m-mode-tmp-map
+ (progn
+ (set-keymap-parent mime-w3m-mode-tmp-map nil)
+ (equal mime-w3m-mode-tmp-map w3m-minor-mode-map)))
+ (setq mime-w3m-mode-tmp-map
+ (copy-keymap w3m-minor-mode-map)))
+ (set-keymap-parent mime-w3m-mode-tmp-map
+ mime-view-mode-default-map)
+ mime-w3m-mode-tmp-map)))
+ '(text-rendered-by-mime-w3m t))))
(error (message (format "%s" err))))))))
;; To avoid byte-compile warning in `mime-w3m-cid-retrieve'.
複雑化した処理による overhead と,copy-keymap() による overhead のどち
らが大きいか,判断に苦しむところです.
;; copy-keymap v.s. (equal + set-keymap-parent 2回)
まあ,keymap の変更はそんなに頻繁に行うわけではないということを考える
と,単純に Emacs20 以前の場合は再起動しないと反映されないことがあるよ,
とコメントに書いておくだけという解決も考えられますが….
アイデアや意見など募集中.
--
土屋 雅稔 ( TSUCHIYA Masatoshi )