2011年11月11日

Re: [質問] FolderモードでRET/SPC した際の hookは?

In [Wanderlust : No.14558] 山口さん wrote:
> Folderモードで RET/SPC した際、wl-folder-jump-to-current-entity が実行
> されますが、その際のhookは、何が呼ばれるのかご教示いただけないでしょうか?

> フォルダを選択した際に、接続先のサーバー(社内/社外)によって、
> ssl-program-arguments を変えたいのですが、
> 適切なものが見つからず質問しました。

そういう目的だとすれば wl-folder-jump-to-current-entity がいろん
な処理を行なう前に評価される hook ですね。おそらく無いです。でも
defadvice による関数の書き換えが使えるのではないでしょうか。
たとえばこんな感じ。

;; もし必要なら。
(require 'ssl)

(defadvice wl-folder-jump-to-current-entity (around modify-ssl-args activate)
"Modify `ssl-program-arguments' according to folder."
(let* (;; フォルダ名をゲット。値は文字列または nil。
(folder (wl-folder-get-entity-from-buffer))
;; `ssl-program-arguments' の値をフォルダに応じて変更。
(ssl-program-arguments
(cond ((null folder)
ssl-program-arguments)
((string-match "" folder)
'("ARG" "ARG" "ARG"...))
((string-match "REGEXP_for_社内" folder)
'("ARG" "ARG" "ARG"...)) ;; 社内用 args
((string-match "REGEXP_for_社外" folder)
'("ARG" "ARG" "ARG"...)) ;; 社外用 args
(t
ssl-program-arguments))))
ad-do-it))

ヒント:
defadvice の引数 around は、この関数の丸ごと置き換えを意味します。
他に before と after があります。
オリジナルの関数定義は ad-Orig-関数名 という名前の関数で保存され
ていて、上の例では ad-do-it という呪文がそれを実行します。

lisp/emacs-lisp/advice.el にたくさんの用例があるので参考にしてく
ださい。

新しい関数定義がどうなっているかを見るには、defadvice の定義全体
を次のように囲んで C-j するのが便利です。

(let ((ad-default-compilation-action 'never))
(defadvice 関数名 ... ... ...)
(pp (symbol-function '関数名))
nil)

;; 最初の行の never を指定しないと、新しい関数定義が byte compile
;; されて、人間には読めないものになってしまうことが多いです。
--
山岡


投稿者 xml-rpc : 2011年11月11日 07:47
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/107233
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。