タグ別アーカイブ: cygwin

Emacsで編集中のファイルをWindowsの標準アプリやエクスプローラーで開く

調べたらいろいろやりかたは見つかったのですが、パス名に日本語や半角スペースが含まれるとうまく動かなかったり…でわりと苦労したので、
最終的にうまく動いたやつをまとめておきます。

現在編集中のファイルのあるフォルダをエクスプローラーで開く

(defun explorer()
  "ファイルの場所をexplorerで開く"
  (interactive)
  (shell-command "explorer ."))

shell-commandでexplorerを呼びだしているだけです。
引数はbuffer-file-nameからディレクトリパスを導く方法とかいろいろあったのですが、
なんか結局”.”で動きました。

現在編集中のファイルをWindows標準のアプリで開く / diredから特定のファイルをWindows標準のアプリで開く

(defun unix-to-dos-filename(file)
  "ファイルパスの/を\に置換し、sjisに変換"
  (encode-coding-string (concat (mapcar '(lambda (x) (if(= x ?/) ?\\ x)) (string-to-list file))) 'sjis))

(defun cygstart-dired()
  "diredからファイルをWindows標準で開く"
  (interactive)
  (let ((file (dired-get-filename)))
    (message "open %s" file)
    (shell-command (concat "cygstart " (unix-to-dos-filename file)))))

(defun cygstart()
  "現在のファイルをWindows標準で開く"
  (interactive)
  (shell-command (concat "cygstart " (unix-to-dos-filename (buffer-file-name)))))

ここではcygwinに含まれるcygstartというコマンドを利用しています。これはWindows標準のアプリでファイルを開くコマンドです。
cygstartを使わずにファイル名を直接 shell-command に渡しても動きそうな気はするのですが、一部の日本語ファイル名のファイルがうまく開けませんでした。

unix-to-dos-filename はmeadowにデフォルトでついてくる関数を再現したもののようです。