2018年2月19日 星期一

在 WSL (Windows subsystem linux) 模擬 xdg-open

WSL 是 Windows 10 提供的執行原生 Linux 程式的方法
但是如果不能跟 Windows 做某些互動的話很不方便
例如 Linux 中,有時會用 nautilus . 或是 dolphin . 把目前終端機的資料夾打開

幸好 WSL 提供了呼叫原生 Windows 程式的方法
像是
explorer.exe .
/mnt/c/Program\ Files\ \(x86\)/Adobe/Acrobat\ Reader\ DC/Reader/AcroRd32.exe abc.pdf

但是像是各種不同檔案像是 pdf 都需要不同的設定
而且往往 Windows 沒有把這些程式加入 $PATH
要使用絕對路徑去打這些執行檔
純 Linux 中我們會用 xdg-open, kde-open 等等
不幸的是 xdg-open 在 Ubuntu 下(WSL 預設系統)
沒有桌面環境的情形下也是不能用 (link)
而且 xdg-open 用的是 .desktop file,不好用
而 kde-open, gnome-open 都要安裝超大包的 KDE, GNOME 才能用
當然寫一個程式來做這件事情蠻容易的
不過這樣要維護的檔案就很多了,最好能直些沿用系統中的程式跟設定

因此就來試看看比較舊的 run-mailcap
編輯 ~/.mailcap
application/pdf; ...AcroRd32.exe "%s"
inode/directory; explorer.exe "%s"

似乎 run-mailcap abc.pdf 應該就能用了
但是,又不幸的, 因為 mailcap 比較舊,他不能辨識資料夾的 mimetype
不過沒關係,我們可以把 xdg-open 換成另外一個 bash/zsh 的函數
硬性指定 mimetype
function xdg-open()
{
    MTYPE=`mimetype --output-format %m "%1"`
    xdg-open ${MTYPE}:"%1"
}


可惜的,因為 explorer 不能辨識轉 run-mailcap 換過的路徑explorer.exe /mnt/c/...
這樣做還是有問題
所以我們把 run-mailcap 換成只輸出程式名稱
application/pdf; DUMMY="%s" echo ...AcroRd32.exe
inode/directory; DUMMY="%s" echo explorer.exe
註:沒有 DUMMY=%s 的話會那個檔案變成 stdin,還是有問題
然後再修改一下 zshrc 就好了
function xdg-open()
{
    MTYPE=`mimetype --output-format %m "%1"`
    PROG=`xdg-open ${MTYPE}:"%1"`
    "${PROG}" "$1"
}

沒有留言:

張貼留言