俺 wanderlust。さっき mailcap と別れてきた

Q. 最近 wanderlust を使い始めました><
添付ファイルを外部アプリで開くにはどうすればいいのでしょう?
A. ファイル名にポイントを合わせて、v を押しましょう。簡単ですね!!!

と言いたいところだが、
実のところ大抵の環境ではこれだけでは不十分で、

  • ホームディレクトリに .mailcap というファイルを作って
  • 中に MIME Type と外部アプリの対応を記述して
  • shell-quote-argument 関数の挙動を変えて
  • windows なら cygwin 入れて

みたいな手間を踏まないと正しくファイルが開かれない。

これは面倒だ。
てか MIME Type って誰得wどのアプリで開くかなんて拡張子で分かるべww
とか考えてしまう私のような半可通には、上の手順は荷が重い。

そこで添付ファイルのオープンは全部外部のランチャにやらせることにした。
windows なら (Meadow 同梱の) fiber.exe,
MacOSX なら open,
linux なら xdg-open といった優秀なコマンド達に頼れば
もう mailcap いらないっしょwww

以下を .wl に追記するだけで達成できるはず。
fiber 使いは↓の例で駄目だったら "c:\meadow\bin\fiber.exe" みたいに絶対パスで指定すると良いと思う。

(defvar my-mime-preview-play-current-entity-appname "fiber"
 "meadow なら fiber, mac なら open, linux なら xdg-open")

(unless (functionp #'mime-preview-play-current-entity-orig)
  (fset #'mime-preview-play-current-entity-orig
        (symbol-function #'mime-preview-play-current-entity)))

(setq mime-play-delete-file-immediately nil)

(defun mime-preview-play-current-entity (&optional ignore-examples mode)
  (interactive "P")
  (if (and mode (not (equal mode "play")))
      (mime-preview-play-current-entity-orig ignore-examples mode)
    (let* ((entity (get-text-property (point) 'mime-view-entity))
           (name (mime-entity-safe-filename entity))
           (filename (expand-file-name (if (and name (not (string= name "")))
                                           name
                                         (make-temp-name "EMI"))
                                       (make-temp-file "EMI" 'directory))))
      (mime-write-entity-content entity filename)
      (message "External method is starting...")
      (let* ((process-name
              (concat my-mime-preview-play-current-entity-appname " " filename))
             (process
              (start-process process-name
                             mime-echo-buffer-name
                             my-mime-preview-play-current-entity-appname
                             filename)))
        (set-alist 'mime-mailcap-method-filename-alist process filename)
        (set-process-sentinel process 'mime-mailcap-method-sentinel)))))

.mailcap 作るのとそんなに手間変わんないか。。。

そんなに動作確認してないので、不具合あれば教えてください。


2010-09-26 追記
コードに誤りがあったため、修正しました。
mime-preview-play-current-entity の最後の方で

        (set-alist 'mime-mailcap-method-filename-alist process name)

としていましたが、正しくは

        (set-alist 'mime-mailcap-method-filename-alist process filename)

であるべきでした。
修正前のコードだと、テンポラリフォルダに一時保存された添付ファイルが削除されずに残り続けてしまいます。すみません。


ところで "Wanderlust FAQ 日本語版"
http://wiki.gohome.org/wlja/?%C0%DF%C4%EA%CA%D4
によると、そもそもこんなことしなくても、.mailcap に

application/*; fiber %s;

と書いとくだけで良いのかもしれない。


2010-10-24 追記
{fiber, open, xdg-open} が起動する直前に、一時保存された添付ファイルが
mime-mailcap-method-sentinel によって削除され、ファイルオープンに失敗してしまうようです。
そこで以下の設定を .wl に追記する必要があります。度々すみません。

(setq mime-play-delete-file-immediately nil)

id:sasakyh さんご指摘ありがとうございます。