[Debian][Gnus] マルチパートのデフォルトの MIME type を変更する

Debian etch + Emacs snapshot + No Gnus でのお話。

最近 (といってもかなり昔に書いたメモだけど) Gnus でメールに hogehoge.diff なファイルをアタッチしても、そのパートが色付いて表示されないのが気になっていた。以前は diff-mode でハイライトされてカラフルで見易かったのに。特に設定を変えた覚えはないんだけど。Gnus の仕様が変わった? んなこたないよなあ…。

などと放置していたのだが、フと昔のメールを表示した際にちゃんと diff のパートがハイライトされていることに気付いた。あれ?

昔のメールと最近のものをよくよく見比べると、なるほど、前者は MIME type が text/x-patch となっているのに対して後者は text/x-diff になっている。ふーむ、どちらも特に自分で指定した覚えはなく単にデフォルトで提示されるタイプを使っているだけなのでそこいらが変わってるクサい。

ちょっと調べてみますか。ごそごそ。

Gnus はアタッチするファイルの拡張子を見て MIME type を決めるが、それは `mailcap-mime-extensions' で定義されている。mailcap.el を見るとちゃんと

(defvar mailcap-mime-extensions
...
    (".diff"  . "text/x-patch")
...

となっていて Gnus では text/x-patch がデフォルトになっている。だが、C-h v で実際に値を見ると

...
 (".diff" . "text/x-diff")
...
 (".diff" . "text/x-patch")
...

とダブって登録されている。他の拡張子についてもいろいろ追加されているようだ。誰がやってんの?

mailcap.el 自身がやってました。というか `mailcap-mime-extensions' の docstring にちゃんと書いてあった。

It is merged with values from mailcap files by `mailcap-parse-mimetypes'.

mailcap-parse-mimetypes() は ~/.mime.types や /etc/mime.types などなどのファイルを調べて MIME type を追加してくれるらしい。Debian だと mime-support パッケージが入っていれば /etc/mime.types が存在する。覗いてみると

text/x-diff                                     diff patch

確かにこういうエントリがあった。犯人はこいつか。

詳しく調べると mailcap.el と /etc/mime.types で86個の拡張子が重複しているようだ。そのうち MIME type が異なるものが35個。

単に重複してるものについては無駄だから消しちゃって、type が違うものについては mailcap.el のほうを採用しよう。えい。

(defadvice mailcap-parse-mimetypes (around delete-dup-entry activate)
  (let* ((parsed mailcap-mimetypes-parsed-p)
	 (orig (or parsed mailcap-mime-extensions)))
    ad-do-it
    (unless parsed
      (setq mailcap-mime-extensions
	    (let ((list mailcap-mime-extensions)
		  entry ret add)
	      (while (setq entry (car list))
		(unless (assoc (car entry) (cdr list))
		  (add-to-list (if (member entry orig) 'ret 'add) entry))
		(setq list (cdr list)))
	      (nreverse (nconc add ret)))))))

こんなのを ~/.gnus.el に追加して無事 *.diff なファイルについてはデフォルトで text/x-patch を提示してくれるようになった。


これで自分が出すメールについては問題なくなったが、他からは text/x-diff で送られてくる可能性がある。そちらもちゃんと対処したいけど、それはまたいずれ。