WSL上のEmacsからWindowsのファイルあるいはフォルダを開く方法を紹介します。
これでdiredをWindowsのファイラ的に活用することができるようになります(多分)。
実態は自分用の備忘録です。
WSLからWindowsのファイル/フォルダを開く
結論
以下のようなシェルスクリプトをWSLのパスが通ったところに置いて、WSL上で実行すればWSLからWindows側のファイル/フォルダを開くことができりょうになります。
#!/usr/bin/zsh
explorer.exe `wslpath -w $1`
ちなみに、diredから使わないのであれば、zshの関数として定義してしまう方がいいと思います。
解説
普段、Windows上でファイル/フォルダのアイコンをダブルクリックした時の動作、つまり
- ファイルの拡張子が登録されていればそのプログラムで開く
- ファイルの拡張子が未知であれば、プログラムの選択画面を出す
- フォルダであれば、フォルダをエクスプローラーで開く
といった動作はexplorer.exe
が担っています。入力にはWindows形式のパス(C:\Users\hoge\piyo
みたいの)をとります。
最近のWSLでは、WindowsのコマンドもWindows側のパスが通っていれば実行できます。
参考:Windows 10のLinux互換環境WSLからコマンドプロンプトのプログラムを呼び出す(バージョン1803対応版)
WSL上からはWindows側のファイルを/mnt/c/
以下で見ることができます。
上記シェルスクリプトの$1
にはこの形式のパスでのファイル/フォルダ名を渡します。
wslpath
コマンドはWindows形式とLinux形式のファイル名の変換をしてくれます。
つまり/mnt/c/Users/hoge/piyo
をC:\Users\hoge\piyo
に変換できます。
細かいオプションは自分で調べていただけると。
参考:【WSL】パスのフォーマットを変換する wslpath コマンドの使い方
diredでWindowsのファイル/フォルダを開く
結論
下記設定をinit.el等に書けば、dired上でw
を押すとそのファイル/フォルダがWindows上で開きます(exlorer.exeで開く)。
;; ファイルをWindowsの関連付けで開く
(add-hook 'dired-load-hook (function (lambda ()
(define-key dired-mode-map "w" 'dired-open-file)
)))
(defun dired-open-file ()
"In dired, open the file named on this line."
(interactive)
(message "WindowsOpening %s..." (dired-get-filename))
(shell-command (mapconcat #'shell-quote-argument
(list "open-in-windows" (dired-get-filename))
" "))
(message "WindowsOpening %s done" (dired-get-filename))
)
解説
最初の設定で、dired上でのキーマップを設定しています。
shell-command
にコマンドを渡すとシェルで実行してくれます。
ただ、渡すコマンドは引数含めて文字列にする必要があるので、mapconcatでコマンドと引数を繋いでいます。
参考: emacsをWindowsシェルとして使う Excelを開いたりファイル名をクリップボード転送できるとすごく便利
Emacsからの安全なシェルコマンド実行