Hatena::ブログ(Diary)

個人メモ(内容無保証)

2010-03-12

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

Q. 最近 wanderlust を使い始めました><

添付ファイルを外部アプリで開くにはどうすればいいのでしょう?

A. ファイル名にポイントを合わせて、v を押しましょう。簡単ですね!!!

と言いたいところだが、

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

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

これは面倒だ。

てか 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 さんご指摘ありがとうございます。

sasakyhsasakyh 2010/09/28 18:09 application/*; fiber %s; みたいに xdg-open を使おうと思ったら、空白を含む日本語ファイル名の添付ファイルが操作できませんでした...Orz。というご報告までに.

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/yamdan/20100312/1268407849