[Date Prev][Date Next][Thread Prev][][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 )