Emacs: Dired から拡張子を見て外部プログラムを起動する dired-win-exec.el

# Dired から拡張子を見て外部プログラムを起動する
Dired からファイルの拡張子によってそれぞれの外部コマンドを起動し、Dired をよりファイラー的に使えるようにする拡張です。

探せばありそうですが製作当初 Linux 用のものしか見当らなかったので自作しました。
Dired 自体にも以前はあった機能のようです。

# ダウンロードとインストール
[ここからダウンロード](https://gist.github.com/s-fubuki/67eec87f072b58b4df6965eee0221e71)し、 `load-path` の通ったディレクトリに置き、`init.el` で以下のような行を書き、後で説明する拡張子とコマンドの関連付けを
変数 `dired-win-exec-list` に設定してください。
以下設定ではデフォルトの `RET` と `f` のキーに割り当てられます。

```emacs-lisp:sample.el
(require 'dired-win-exec)
(add-hook 'dired-mode-hook
          #'(lambda() (local-set-key [remap dired-find-file] 'dired-win-exec)))
;; (setq dired-win-exec-list ... 後述)
```

# 使い方
Dired でカーソルを置いたファイルで `RET` または `f` で起動します(上記で設定されたキー)。
マッチしなればいつも通り関数 `find-file` に渡され Emacs で開きます。

# 変数 `dired-win-exec-list` で拡張子とコマンドの紐付け
## 簡易な設定
ビルトインされた関数 `dired-win-exec-open` を使うと、ウィンドウズ側で関連付けされたコマンドが起動するので記述が大幅に楽にできます。

```emacs-lisp:sample.el
(setq dired-win-exec-list
      '((("jpg" "png" "xcf" "gif" "bmp" "svg" "pdf" "html" "doc" "xls" "xlsm" "xlsx")
         dired-win-exec-open)))
```

## より細やかに設定
基本は以下のように 拡張子とコマンドをリストで並べて書いていきます。
パスの区切は BackSlash でも大丈夫ですが、その場合2重にしてエスケープさせる必要があります。

```emacs-lisp:sample.el
(setq dired-win-exec-list '(("png" "C:/Program Files/IrfanView/i_view32.exe")))
```

### 複数の拡張子
ひとつのプログラムに複数の拡張子を結びつけるにはリストにします。

```emacs-lisp:sample.el
(setq dired-win-exec-list '((("png" "jpg" "gif") "C:/Program Files/IrfanView/i_view32.exe")))
```

### 複数のプログラム
プログラムもリストにして複数設定できます。
`C-u RET` 等と Prefix 付で起動すると起動させるプログラムを選ぶプロンプトが出ます。



```emacs-lisp:sample.el
(setq dired-win-exec-list
      '((("png" "jpg" "gif") 
         ("C:/Program Files/IrfanView/i_view32.exe"
          "C:/Program Files/GIMP 2/bin/gimp-2.8.exe"))))
```

### Emacs の関数
外部プログラムの代わりに Emacs の関数も書くことができます
`.html` のように Emacs 本体でも外部プログラムでも開きたいファイルの場合等に利用できます。

```emacs-lisp:sample.el
(setq dired-win-exec-list
      (("html" "svg")
       (find-file
        "C:/Program Files/Google/Chrome/Application/chrome.exe")))
```

以上の要領で設定したい分だけこのリストをいくつも並べて書いていきます。
同じ拡張子なら先着順です。

```emacs-lisp:sample.el
(setq dired-win-exec-list
      '((("png" "jpg" "gif") 
         ("C:/Program Files/IrfanView/i_view32.exe"
          "C:/Program Files/GIMP 2/bin/gimp-2.8.exe"
          find-file))
        (("xlsm" "xls" "xlsx")
         "C:/Program Files/Microsoft Office 15/root/office15/EXCEL.EXE")
        ("pdf" "C:/Program Files/Adobe/Acrobat Reader DC/Reader/AcroRd32.exe")
        以下設定したいだけ続く...))
```


# その他の設定できる変数
## dired-win-exec-default 
`dired-win-exec-list` でマッチする拡張子がなかったときに最終的に渡される関数です。
デフォルトは `find-file` です。

## dired-win-exec-select
`dired-win-exec-list` で複数のプログラムが設定された拡張子のとき、この変数が `非NIL` だと選択プロンプトが必ず出るようになります。
デフォルトは `nil` で プレフィクス起動のときのみ選択プロンプトになります。

## dired-win-exec-message
|値|説明|
|:-:|:-:|
| nil    | コマンド起動メッセージを表示しない                                    |
| 'echo  | メッセージは表示するが `*Messages* Buffer` には記録しない(デフォルト) |
| その他 | 通常のメッセージ同様、表示をしメッセージバッファにも記録する          |

# 対応している Emacs のバージョン

> GNU Emacs 25.3.1 (i686-w64-mingw32)
>  of 2017-09-18

# 起動メッセージの表示に関するオプションを追加しました
## 変数 `dired-win-exec-message` を追加しました。
   使用頻度に対して意味もなくメッセージバッファを汚しすぎると思ったので、   不要だと一旦は削除したのですが、   初回起動のコマンドの場合起動が遅くフリーズしたようになるので、   この変数でコントロールできるようにしました。