Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

previm をWSLから使えるようにwsl_modeを追加/pull reqしてみた

$
0
0

はじめに

vim でマークダウンを書くときに、previm を利用している。
WSL 上に環境を作ったが、previm がうまく動かなかったので、修正して動くようにしてみた。

環境

keyvalue
OSWin 10 Pro
WSL ver.2
WSL OSUbuntu 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もない場合は、エラーとなるみたい。

.vimrc
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

previm.png

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 には下記のように、記述することで無事に動いた。

.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


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>