Wanderlust

[TOP] -- [Emacsen] -- [Wanderlust]

現在の私の MUA 乗換候補の筆頭, Wanderlust について説明しています。

基本的に, 私がやった設定を覚え書き程度に書いていきます。 code が汚ないのは ご勘弁を。あと, code で恥ずかしい部分などがあれば こっそり教えてください。(^^;


更新情報

[2000/05/10]
高橋さん ご指摘により,imput を使って送信したい を, 修正。m(__)m
[1999/12/08]
Summary 用関数 を, pilot-ml などに対応させました :-)
[1999/11/17]
elmo-tokenize-string<f> が廃止されたので, Summary 用関数 を修正。
[1999/11/13]
EMIKO の SEMI-1.14 昇格までの繋ぎとして, Mailcrypt で clearsign 形式の PGP を使う〜
[1999/10/22]
日経Linux の web のほう, 文章の詰めがイマイチなまま 私の知らないうちに公開されてるみたい (-"-
[1999/09/30]
10/08 発売の 日経Linux 11月号に, 記事掲載予定。 導入者向けなので, たぶん面白くないです。 ただ, 加筆修正したものが 日経Linux の Web で公開されることになりました。 現在, 加筆修正中 (^^;
[1999/09/03]
Draft mode で, C-cC-j が wl-template-select に bind される予定なので, c-sig の設定をちょっと変更。 最初から, こうしとけばよかったかも。

Menu

% Wanderlust とは?
+ 特徴
[-] 基本設定で できること
/ X-Emacs を入れたい
+ Message-ID: をきちんと付けたい
- NNTP で読んだ article が cache されちゃう
[-] ちょっとだけ改造してみる
+ 自分が差出人である mail は, To:某 と表示したい
+ 自分が差出人である mail への reply 時は, To: と Cc: を保存する。
+ 自分の address を Cc: に入れないようにしたい
+ Summary buffer の subject に, ML名 や ML-count も 表示する
+ Unmark って大抵 1種類の mark に対してしかしないのに, 最後に enter 打つが面倒だ
+ 私の wl-init-file
[-] 外部 package を使う
+ Mailcrypt で, clearsign 形式の PGP を使いたい
+ X-Face を使いたい
+ Signature 挿入に c-sig を使いたい
/ BBDB を使いたい
/ Cancel Lock を使う
/ Citation Header が味気ない...
[-] 人種3 な人のために... (謎)
+ imput を使って送信したい
+ folder 内の message を pack したい
+ imget を使って mail を inc したい
[-] Link
% Wanderlust Official page
% Wanderlust ML archive
% 奥西さんの Wanderlust on OS/2 PMMule の page

Wanderlust とは?

Emacs-Lisp level で IMAP4 に対応した, SEMI based な Mailer です。 作者が Mew-img な寺西さんであることもあって, key bind など Mew に似ているため, 使い易いです。

どんどん他の MUA のいいところを吸収しているので (褒めてるんですってば!), 多機能で heavy user も満足。

「SEMI based な Mew が欲しい」と思っている人 (かなり居そう...) には おすすめかもしれません。

Official Web Site
http://www.gohome.org/wl/
Mailing List archive
http://lists.airs.net/wl/archive/
FTP
Original: ftp.gohome.org /pub/elisp/wl/
Mirror: daidai.kuis.kyoto-u.ac.jp /pub/tsumura/wl/

Screen Shot ... PNG: 30KB


特徴


基本設定で できること

X-Emacs: を入れたい

ver.0.4.4 から, User-Agent: に XEmacs version の名前も 挿入されるようになったみたいなので, この項は破棄。

X-Mailer: の代わりに User-Agent: を 付けるようにする設定は以下のとおりです。

(setq wl-generate-mailer-string-func 'wl-generate-user-agent-string)

Message-ID: をきちんと付けたい

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> をかけたほうが美しいかも...。

NNTP で読んだ article が cache されちゃう

変数 elmo-nntp-use-cache を 非nil に set することで 設定できます。

(setq elmo-nntp-use-cache nil)

同種の変数として,elmo-imap4-use-cache, elmo-pop3-use-cache があります。


ちょっと改造してみる

自分が差出人である mail は, To:某 と表示したい

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)

自分が差出人である mail への reply 時は, To: と Cc: を保存する。

現在 (2.0.0 以降) では, default で そういう動きをするようになっています。 というわけで, 削除。

自分の address を Cc: に入れないようにしたい

私は, 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 の subject に, ML名 や ML-count も表示する

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)

Unmark って大抵 1種類の mark に対してしかしないのに, 最後に enter 打つのが面倒だ

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)

私の wl-init-file

おまけです。全然整理できてませんが, 恥ずかしながら公開(^^;


外部 package を使う

x-face, c-sig, BBDB, mu-cite などの package を Wanderlust で使う方法です。

Mailcrypt で, clearsign 形式の PGP を使いたい

次期 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)))

X-Face を使いたい

Wanderlust で X-Face を使うための設定方法です。 x-face ver.1.3.x より, 方法が変わりました。 こんな感じでしょうか。

XEmacs の場合

私の環境では, x-faceREADME.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))))

Emacs/Mule の場合

x-face-mule の使いかたをどうぞ。

あと雑多なこと

なお私の環境では, 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)

Signature 挿入に c-sig を使いたい

現在では, 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 を使いたい

bbdb-wl.el が同梱されるようになりました。 というわけで, この項は破棄。

「BBDB って何?」って方は, BBDB の説明 をどうぞ。

(require 'bbdb-wl)
(bbdb-wl-setup)
(add-hook 'wl-mail-setup-hook 'bbdb-insinuate-sendmail)

Cancel Lock を使う

canlock.el で, NetNews 投稿時に Cancel Lock header をつけるべし。

(add-hook 'wl-news-send-pre-hook
          'canlock-insert-header)

Citation 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な人のための設定です :-)

imput を使って送信したい

自他共に認める「元祖 人種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: ")))))

folder 内の message を pack したい

現在の version では, package に 奥西さん謹製の elmo-localdir-pack-number<f> が含まれています。 よってこの項は破棄。

(define-key wl-summary-mode-map "\M-o" 'wl-summary-pack-number)

imget を使って mail を inc したい

ちょっと邪道かもしれませんが, 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))))

[TOP] -- [Emacsen] -- [Wanderlust]
[Tree Map]
邑 tsumura@kuis.kyoto-u.ac.jp