2007/02/11

Mew の拡張ツールを作る(2)

Mew の拡張ツールを作る(1)で紹介したツール ptkbiff.pl は単なるシグナルで切り替えの出来るアニメーションツールだ(ツールというのもおこがましい程単純だが)。

ここで Mew を拡張するためには elisp 及び Mew のソースに手を染める必要がある。

ちょっと古いのだが会社都合で Mew 4.2 を元に改造を行った。Mew 5.X 系でもこの部分が同様ならそのまま適応できるかも。

さて改造の要旨だが、Mew の biff 機能で新着メールを見つける箇所と新着メールを取り込こむ箇所を見つけ、その部分に前回作ったptkbiff.pl をキックするコードを挿入しれやればよいことになる。

Mew の biff についてコードを探ると mew-biff-bark という新着メールがあるとモードラインにメール数を表示し、ビープを鳴らすファンクションがある。また、ここでは新着メールを取り込めばモードラインのメール数をクリアする機能があるようだ。

この部分にちょうど良い hook が設定されていればそれを利用してもいいのだが無い。仕方ないので elisp の「利点」を生かして、男らしくオーバーライドした。

ところで mew-biff-bark でモードラインのメール数をクリアする機能と一緒に ptkbiff.pl をキックする機能を入れると反応が鈍い。どうやらメールを取り込んだ直後に働くわけではなく、メールを確認するサイクルで取り残しメールが無ければクリアするようだ。

仕方ないのでもう少しコードを探ると直接クリアだけする関数 mew-biff-clear という関数があるではないか!これをまたまたオーバーライドすることによってことなきをえた。

ptkbiff.pl をバックグラウンドモードで走らせたうえで、以下のコードを .mew.el または .emacs に加えた Emacs を起動して Mew を走らせて初めて biff ツールとして完成する。


(setq mew-use-biff t)
;;(setq mew-use-biff-bell t)
;;(setq mew-pop-biff-interval 5)

;; mew-biff-bark OVER WRITE
(defun mew-biff-bark (n)
"Over writed mew-biff-bark"
(if (= n 0)
(progn
(setq mew-biff-string nil)
(call-process "kill" nil nil nil "-HUP" (ptkbiff-pid-read)))
(if (eq mew-biff-string nil)
(progn
(call-process "kill" nil nil nil "-INT" (ptkbiff-pid-read))
(if (not (eq mew-use-biff-bell nil)) (beep))))
(setq mew-biff-string (format "Mail(%d)" n))))

;; mew-biff-clear OVER WRITE
(defun mew-biff-clear ()
(setq mew-biff-string nil)
(call-process "kill" nil nil nil "-HUP" (ptkbiff-pid-read)))

(defun ptkbiff-pid-read ()
"ptkbiff pid read from /var/tmp"
(save-excursion
(setq ptkbiff-pid-file (concat "/var/tmp/ptkbiff." user-login-name))
(find-file ptkbiff-pid-file)
(forward-word 1)
(setq ptkbiff-pid (buffer-substring (point-min) (point)))
(kill-buffer (concat "ptkbiff." user-login-name))
ptkbiff-pid))

0 件のコメント: