背景
Windows10標準機能として定着してきたWSL(Windows Subsystem for Linux)ですが、コマンドライン上で生活しているとMacのopenコマンドのようにパワポやPDF、画像ファイルを開きたくなることが結構あります。
理想的にはWindows側とUbuntu側をあまり意識せずにファイルをいじりたいところです。
下記リンクでは、引数で指定したファイルをcmd.exeで開くようにaliasを設定することで解決しています。
上記の問題点として、Ubuntu側から見たWindows側のファイル(/mnt/c/以下のファイル)を開けないことが挙げられます。
これを解決するために仮想openコマンドを実装します。(ほぼここのパクリです)
やったこと
下記をopen
というファイル名として保存し、実行権限を与えた上でPATHの通ったディレクトリに移動します。
#!/bin/bash
to_winpath(){
local abs_path=`readlink -f $1`
if echo $abs_path | grep -q /mnt/c; then
local win_path="C:"${abs_path#/mnt/c}
echo ${win_path//\//\\}
else
local wsl_path=`powershell.exe -Command 'echo ($env:LOCALAPPDATA + "\lxss")' | tr -d '\r'`
local internal_path=${abs_path//\//\\}
echo "${wsl_path}${internal_path}"
fi
}
/mnt/c/Windows/explorer.exe `to_winpath $@`
機能
macのopen
コマンドのように-a
オプションで開くアプリケーションを選択することはできませんが、explorer.exe
でダブルクリックで開くように設定されているアプリケーションで開かれます。
これはWSLから見たWindowsのディレクトリ(/mnt/c/以下)にいても使うことができます。
$ open image.png # カレントディレクトリの画像を開く
$ open ./hoge.pptx # 相対パスで指定したパワポを開く
$ open ./ # カレントディレクトリをexplorer.exeで開く
やっていること
to_winpath
でexplorer.exe
に渡すファイルパスを生成し、explorer.exe
で実行しているだけです。
open
コマンドに引数として渡したファイルパスが/mnt/c
から始まる場合にはC:
、それ以外ではC:\Users\user\AppData\Local\lxss
から始まるファイルパスに変換してexplorer.exe
に渡しています。
余談
実装してみるとVimから画像ファイルを開ける上に、rangerを使っているのでコマンドライン環境でほぼ完結してしまいそうです。
この記事を書いてる途中で気づいたんですが、wsl-open
というコマンドがありましたw
npm
で簡単にインストールできます。