現在の私の 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))))