現在の私の MUA 乗換候補の筆頭, Wanderlust について説明しています。
基本的に, 私がやった設定を覚え書き程度に書いていきます。 code が汚ないのは ご勘弁を。あと, code で恥ずかしい部分などがあれば こっそり教えてください。(^^;
Emacs-Lisp level で IMAP4 に対応した, SEMI based な Mailer です。 作者が Mew-img な寺西さんであることもあって, key bind など Mew に似ているため, 使い易いです。
どんどん他の MUA のいいところを吸収しているので (褒めてるんですってば!), 多機能で heavy user も満足。
「SEMI based な Mew が欲しい」と思っている人 (かなり居そう...) には おすすめかもしれません。
Screen Shot ... PNG: 30KB
ver.0.4.4 から, User-Agent: に XEmacs version の名前も 挿入されるようになったみたいなので, この項は破棄。
X-Mailer: の代わりに User-Agent: を 付けるようにする設定は以下のとおりです。
(setq wl-generate-mailer-string-func 'wl-generate-user-agent-string)
default では (system-name) の返り値を使うように
なっているので, Emacs によっては domain なしの machine名 しか
つかないことがあります。
wl-message-id-domain を設定することによって Message-ID: に使う domain名 を変えることができます。 私は以下のようにしています。
(setq wl-message-id-domain (concat (system-name) ".kuis.kyoto-u.ac.jp"))
Meadow で使う人は, (system-name) に
downcase<f> をかけたほうが美しいかも...。
変数 elmo-nntp-use-cache を 非nil に set することで 設定できます。
(setq elmo-nntp-use-cache nil)
同種の変数として,elmo-imap4-use-cache, elmo-pop3-use-cache があります。
Summary buffer で, 自分が差出人の mail に関して, その差出人欄が 自分と表示されてしまいます(あたりまえ)。
これを Mew/IM風 に「To:どこそこ」という表示にしたい場合は, 以下のような 感じで wl-summary-from-func を設定するとよいと思います。 3分間ハッキングなので, 冗長なところもあるかと思いますが ご勘弁を。
(defun TT:wl-summary-from-func-petname (from)
(let ((to (elmo-msgdb-overview-entity-get-to entity))
(get-petname-func))
(if (and (string= (wl-address-header-extract-address from)
(wl-address-header-extract-address wl-from))
to)
(progn
(if wl-use-petname
(setq get-petname-func 'wl-address-get-petname)
(setq get-petname-func
'(lambda (fromstr)
(or (car (wl-chop-full-name fromstr))
(nth 1 (wl-chop-full-name fromstr))))))
(concat "To:"
(mapconcat
(function (lambda (petname)
(funcall get-petname-func petname)))
(wl-parse-addresses to)
",")))
(if wl-use-petname
(wl-address-get-petname from)
from))))
(setq wl-summary-from-func 'TT:wl-summary-from-func-petname)
現在 (2.0.0 以降) では, default で そういう動きをするようになっています。 というわけで, 削除。
私は, From: で自分の address を見せているのだから Cc: にも自分の address を見せるのは冗長だと思ってます。(自分への carbon copy は, Bcc: や Dcc: や Fcc: を使うべき)
Mew では mew-mail-address-list に設定した address は Cc: に入れないようにしてくれるのですが, Wanderlust でも wl-from の address は Cc: に入れないようにしてみます。
ちょっとトリッキィです。将来的には動かないかもしれません。
(defadvice wl-draft-delete-myself-from-cc
(around TT:wl-delte-myself-from-cc activate)
(let ((wl-subscribed-mailing-list
(cons (wl-address-header-extract-address wl-from)
wl-subscribed-mailing-list)))
ad-do-it))
Summary buffer の line-format で, subject のところに ML名 や ML-count を表示できるようにします。ちなみに policy は,
です。いろいろ extra-field を保存するので msgdb が太りますが, ご了承を。(^^; とりあえず 私が受けとる主な ML の format に対応してみました。 書いたばかりなので冗長なところも多そうですが, そのうち整理します。
(setq elmo-msgdb-extra-fields
'("x-ml-name" "x-mail-count" "x-ml-count" "x-sequence"))
(defun TT:wl-summary-subject-func (subject-string)
(let ((folder wl-summary-buffer-folder-name)
(subj subject-string)
(sequence) (ml-name) (ml-count))
(if (boundp 'entity)
(setq sequence (elmo-msgdb-overview-entity-get-extra-field
entity "x-sequence")
ml-name (or (elmo-msgdb-overview-entity-get-extra-field
entity "x-ml-name")
(and sequence
(car (split-string sequence " "))))
ml-count (or (elmo-msgdb-overview-entity-get-extra-field
entity "x-mail-count")
(elmo-msgdb-overview-entity-get-extra-field
entity "x-ml-count")
(and sequence
(cadr (split-string sequence " "))))))
;; もとからついてる ML名 等を除去
(if (string-match
"^\\(\\[\\|(\\)\\(.+\\)[ :]\\([0-9]+\\)\\(\\]\\|)\\)[ \t]+"
subject-string)
(progn
(setq subj (substring subject-string (match-end 0)))
(if (not ml-name) (setq ml-name (match-string 2 subject-string)))
(if (not ml-count) (setq ml-count (match-string 3 subject-string)))))
;; extra-field から取得した data を付加
(if (and ml-name ml-count)
(if (string= folder wl-default-folder)
(format "(%s %05d) %s"
(car (split-string ml-name " "))
(string-to-int ml-count)
subj)
(format "#%05d %s"
(string-to-int ml-count) subj))
subj)))
(setq wl-summary-subject-func 'TT:wl-summary-subject-func)
Summary で一度つけてしまった mark を unmark したいとき, `U' (wl-summary-unmark-all) を使います。これは複数の mark を一気に 消すことができますが, 私は大抵 1種類 の mark しか一度に消さないので, mark を入力したあとに enter を打鍵するのが面倒に思います。
というわけで, Mew と同じ (多分) ように, ひとつの mark のみを入力すれば いいようにします。
(defun TT:wl-summary-unmark-all (mark)
(interactive "cUnmark: ")
(save-excursion
(wl-summary-delete-all-mark (char-to-string mark))))
(define-key wl-summary-mode-map "U" 'TT:wl-summary-unmark-all)
おまけです。全然整理できてませんが, 恥ずかしながら公開。(^^;
x-face, c-sig, BBDB, mu-cite などの package を Wanderlust で使う方法です。
次期 SEMI になることが目されている EMIKO を使うことによって, mailcrypt なしでも clearsign (ASCII armor) 形式の PGP が扱えます。 この方法は, SEMI 1.14 が出るまでの繋ぎとして 紹介します。
以下のコードによって, Summary モードで 「C-c / v (verify)」「C-c / d (decrypt)」, Draft モードで 「C-c / s (sign)」「C-c / e (encrypt)」 ができるようになります。
(add-hook 'wl-summary-mode-hook 'mc-install-read-mode)
(add-hook 'wl-mail-setup-hook 'mc-install-write-mode)
(defun mc-wl-verify-signature ()
(interactive)
(save-window-excursion
(wl-summary-jump-to-current-message)
(mc-verify)))
(defun mc-wl-decrypt-message ()
(interactive)
(save-window-excursion
(wl-summary-jump-to-current-message)
(let ((inhibit-read-only t))
(mc-decrypt-message))))
(eval-after-load "mailcrypt"
'(setq mc-modes-alist
(append
(quote
((wl-draft-mode (encrypt . mc-encrypt-message)
(sign . mc-sign-message))
(wl-summary-mode (decrypt . mc-wl-decrypt-message)
(verify . mc-wl-verify-signature))))
mc-modes-alist)))
Wanderlust で X-Face を使うための設定方法です。 x-face ver.1.3.x より, 方法が変わりました。 こんな感じでしょうか。
私の環境では,
x-face の README.ja
にあるように (x-face-xmas-replace-highlight-headers)
してもナゼか表示されません。で, 以下のように Mew 用の関数を
使ってます。
(setq wl-highlight-x-face-func
'x-face-xmas-mew-display-x-face)
(add-hook 'wl-mail-setup-hook
(function (lambda () (x-face-insert))))
なお私の環境では, XEmacs で X-Face つきの mail を
(x-face-xmas-display-x-face 1) した状態
(つまり x-face-xmas-auto-image が t とか) で
送信しようとすると, Wanderlust では ナゼか
Buffer read only <#killed buffer>
と言われてしまうので, 以下のようにして逃げてます。
(defadvice wl-draft-send-and-exit ;; 送る前に XPM の inline 表示を外す
(before TT:toggle-off-x-face-xmas-display activate)
(if (featurep 'x-face-xmas)
(x-face-xmas-display-x-face -1)))
(x-face-xmas-remove-x-face-glyph) を 使ったほうが
いいのかな...?
あと, 今までの MUA になく「read only」で引っかかるので, 面倒なのでこうしちゃいました。ま, 大丈夫でしょう。
(setq x-face-xmas-inhibit-read-only t)
現在では, c-sig を使わなくとも template 機能を使えば 同様のことができます。 「他の MUA と設定を共有したい」など, 特殊な環境の人のみ ご利用ください。
wl-0.10.1 (以降) では, 以前ここに書いてあった wl-mail-overload-functions<f> に defadvice する 古い方法では動きません。単純に, ~/.wl で, こうしてください。
(defun TT:insert-signature (&optional arg)
(interactive "P")
(if arg (insert-signature-eref)
(insert-signature-automatically)))
(define-key wl-draft-mode-map "\C-c\C-i" 'TT:insert-signature)
C-cC-i で, automatically 挿入。 C-uC-cC-i で選択挿入します。call-interactively したほうがいいのかな?
bbdb-wl.el が同梱されるようになりました。 というわけで, この項は破棄。
「BBDB って何?」って方は, BBDB の説明 をどうぞ。
(require 'bbdb-wl) (bbdb-wl-setup) (add-hook 'wl-mail-setup-hook 'bbdb-insinuate-sendmail)
canlock.el で, NetNews 投稿時に Cancel Lock header をつけるべし。
(add-hook 'wl-news-send-pre-hook
'canlock-insert-header)
mail-citation-hook に, mu-cite などの 外部 package を指定するのがいいという結論に至りました。 というわけで, この項は破棄。
(autoload 'mu-cite/cite-original "mu-cite" nil t) (add-hook 'mail-citation-hook 'mu-cite/cite-original)
以下は, 人種3な人のための設定です
。
自他共に認める「元祖 人種3」こと奥西さんの手による im-wl.el が package に附属してますので, これを Wanderlust と同じ directory に置いて, 以下のように設定しましょう。
(autoload 'wl-draft-send-with-imput-async "im-wl") (setq wl-draft-send-func 'wl-draft-send-with-imput-async)
また, 私は mail-self-blind を non-nil に設定していますが, imput を使う場合は Bcc: よりも Dcc: を使うほうがいいので, そうすることにします。 (Gnus を併用したりしない人は, こうする必要もないでしょうが...)
(add-hook 'wl-mail-setup-hook
(function
(lambda ()
(save-excursion
(goto-char 0)
(replace-regexp "^Bcc: " "Dcc: ")))))
現在の version では, package に 奥西さん謹製の elmo-localdir-pack-number<f> が含まれています。 よってこの項は破棄。
(define-key wl-summary-mode-map "\M-o" 'wl-summary-pack-number)
ちょっと邪道かもしれませんが, imget を使って spool の mail を inc してみましょう。Summary において, key ``M-i'' に割当ててみます。
POP 環境で mail を inc したい方は,pipe folder を使うほうが容易です。
詳しくは info を見ましょう。Imget は,あくまで人種3な方,
あるいは local spool から mail を inc したい方のみお使いください。
(defun TT:wl-inc-mail ()
(interactive)
(message "Incing ... ")
(call-process "imget" nil nil nil)
(if (and (boundp 'wl-summary-buffer-folder-name)
(eq wl-summary-buffer-folder-name wl-default-folder))
(wl-summary-sync-force-update)
(wl-summary-goto-folder-subr wl-default-folder 'force-update nil nil)))
(add-hook 'wl-summary-mode-hook
(function
(lambda ()
(define-key wl-summary-mode-map "\M-i" 'TT:wl-inc-mail))))
tsumura@kuis.kyoto-u.ac.jp