fiber.exeなんてない人のための関連付け実行 on bash and ntemacs

meadowにはfiber.exeが付属する。
これは、ファイルをwindowsの関連付けに従って開くコマンドで、meadowからofficeが起動できたりして割と便利に使える。


が、ntemacsにはそんなものない。
どうにかならんかな、と思ってぐぐると、

start

というコマンドを発見。
引数にファイルとかフォルダとかとれば、いい感じに開いてくれる。


ただ、これはcmd.exeの組み込みのようなので、コマンドプロンプトの外から、例えばbashから使おうとするなら、

o(){
    cmd.exe //c start $1
}

とすればできると思ったら、たまにできないことがあった。え?
具体的には、引数によってはコマンドプロンプトが開いてしまう。


なんでかなーと思いつつ分かんないので諦めてると、偶然以下のページを発見。
2010-06-18
どうやら、第一引数を空文字列にすれば良さそう。定義を以下のように修正。

o(){
    if [ $# -eq 0 ]; then # 引数がなかったらカレントディレクトリを開く
        local f=.
    else
        local f="$1"
    fi
    cmd.exe //c start "" "$f"
}

失敗なく開くようになった。


せっかくなので、emacsにも同様の関数を追加する。こちらはシステムを自動判別。

(defun my-x-open (file)
  "open file."
  (interactive "FOpen File: ")
  (message "Opening %s..." file)
  (cond ((not window-system)
         (find-file file))
        ((eq system-type 'windows-nt)
         (call-process "cmd.exe" nil 0 nil "/c" "start" "" (convert-standard-filename file)))
        ((eq system-type 'darwin)
         (call-process "open" nil 0 nil file))
        (t
         (call-process "xdg-open" nil 0 nil file)))
  (recentf-add-file file)
  (message "Opening %s...done" file))

で、

startを自力で発見してから、msysには同名のコマンドが含まれているのに気づいた。
うわあ無駄骨。
中身はシェルスクリプトで、大体上と同じことをやっている。