はじめに
vim でマークダウンを書くときに、previm を利用している。
WSL 上に環境を作ったが、previm がうまく動かなかったので、修正して動くようにしてみた。
環境
key | value |
---|---|
OS | Win 10 Pro |
WSL ver. | 2 |
WSL OS | Ubuntu 18.04.3 LTS |
vim ver. | 8.0 (デフォルト) |
open-browser.vim | 未利用 |
Windowsで使うブラウザ | Google Chrome |
previm on .vimrc
previm/previm: Realtime preview by Vim. (Markdown, reStructuredText, textile)
によると、.vimrc
では下記を指定する必要がある。
ちなみに指定していない場合は、open-browser
が呼ばれる。open-browser
もない場合は、エラーとなるみたい。
letg:previm_open_cmd='ブラウザを開くコマンド'
ブラウザを開くコマンド on WSL
さて、WSL でブラウザを開くコマンド
は何だろうかと。
WSL では、Windowsのディレクトリがマウントされている。
デフォルトだと、/mnt
にマウントされている。
ということは、Chrome の exe ファイルも見つけることが可能。
% ll /mnt/c/Program\ Files\ \(x86\)/Google/Chrome/Application/chrome.exe
-r-xr-xr-x 1 hirano00o hirano00o 1694704 10月 9 12:52 '/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe'
これを bash 上で実行すると、新規ウィンドウで Chrome が開く。
引数に、相対パスでファイルを渡すと、新規タブでそのファイルが開かれる。
% /mnt/c/Program\ Files\ \(x86\)/Google/Chrome/Application/chrome.exe .vim/plugged/previm/README.mkd
Chrome の URL に見慣れない文字列が
wsl%24/Ubuntu/home/... とは?
WSL のパスと Windows のパス
WSL/Linux環境のファイルシステムは、“¥¥wsl\$¥(ディストリビューションの名前)¥”というUNCパスで表現される。たとえば、「Debian」を利用している場合は“¥¥wsl$¥Debian¥”となる。
WindowsからLinuxファイルへのアクセスが可能に ~「Windows 10 19H1」におけるWSLの改善 - 窓の杜
とのことで、つまり Windows の Chrome から WSL 上のファイルを開くためには、上記の形にパスを変える必要がある。
Ubuntu on WSL 上の previm では、ファイルパスは /home
から始まるため、これに何とかして \\wsl$\Ubuntu
を付与する必要がある。
ところで WSL にはデフォルトで wslpath
という WSL <-> Windows パス変換するコマンドがインストールされているらしい。
【WSL】パスのフォーマットを変換する wslpath コマンドの使い方 | ラボラジアン
これを使うと、
% wslpath -w .vimrc
\\wsl$\Ubuntu\home\hirano00o\.vimrc
見事変換される。
previm の修正
まず、どのように追加するかだが、せっかくなので汎用的にしたい。
vim では、Linux かどうかの判別はできても、WSL かどうかの判別はできない。
通常の Linux では、wslpath はない。
ということで、オプションを追加することにする。
% grep open_cmd */*.vim
autoload/previm.vim: if exists('g:previm_open_cmd')&&!empty(g:previm_open_cmd)
autoload/previm.vim: if has('win32')&& g:previm_open_cmd =~? 'firefox'
autoload/previm.vim: call s:system(g:previm_open_cmd .' "file:///'. fnamemodify(a:preview_html_file, ':p:gs?\\?/?g').'"')
autoload/previm.vim: call s:system(g:previm_open_cmd .' '''. system('cygpath -w '. a:preview_html_file).'''')
autoload/previm.vim: call s:system(g:previm_open_cmd .' '''. a:preview_html_file .'''')
autoload/previm.vim を修正すれば良さそう。
で、追記してみた。
% git diff HEAD
diff --git a/autoload/previm.vim b/autoload/previm.vim
index cc1b473..53786e9 100644
--- a/autoload/previm.vim
+++ b/autoload/previm.vim
@@ -17,6 +17,8 @@ function! previm#open(preview_html_file) abort
call s:system(g:previm_open_cmd .' "file:///'. fnamemodify(a:preview_html_file, ':p:gs?\\?/?g').'"')
elseif has('win32unix')
call s:system(g:previm_open_cmd .' '''. system('cygpath -w '. a:preview_html_file).'''')
+ elseif get(g:, 'previm_wsl_mode', 0)==# 1
+ call s:system(g:previm_open_cmd .' '''. system('wslpath -w '. a:preview_html_file).'''')else
call s:system(g:previm_open_cmd .' '''. a:preview_html_file .'''')
endif
.vimrc には下記のように、記述することで無事に動いた。
letg:previm_open_cmd='/mnt/c/Program\ Files\ \(x86\)/Google/Chrome/Application/chrome.exe'letg:previm_wsl_mode=1
せっかく WSL に対応させたので、プルリク出してみた。
果たしてマージされるかな...
add previm_wsl_mode by hirano00o · Pull Request #135 · previm/previm