LoginSignup
2
3

More than 3 years have passed since last update.

diredモード on WSLからWindowsのファイルを開く

Posted at

WSL上のEmacsからWindowsのファイルあるいはフォルダを開く方法を紹介します。
これでdiredをWindowsのファイラ的に活用することができるようになります(多分)。
実態は自分用の備忘録です。

WSLからWindowsのファイル/フォルダを開く

結論

以下のようなシェルスクリプトをWSLのパスが通ったところに置いて、WSL上で実行すればWSLからWindows側のファイル/フォルダを開くことができりょうになります。

open-in-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/piyoC:\Users\hoge\piyoに変換できます。
細かいオプションは自分で調べていただけると。
参考:【WSL】パスのフォーマットを変換する wslpath コマンドの使い方

diredでWindowsのファイル/フォルダを開く

結論

下記設定をinit.el等に書けば、dired上でwを押すとそのファイル/フォルダがWindows上で開きます(exlorer.exeで開く)。

init.el
;; ファイルを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からの安全なシェルコマンド実行

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3