hideharu092の日記

プログラミング言語(PythonやGo)、Vimの話、Webサービスについて語る

WSL+fish+Vim(C/C++、Python、Markdown)の環境構築4

この記事でわかること

最初に

この記事では、度々私のvimrcやdein.toml、dein_lazy.tomlなどが一部抜粋して載せてあります。
Githubにあげているので、全体を見たい場合はどうぞ。
私のdotfiles

deinのtomlでc/c++とPython

まず、前回の記事では、コメントアウトやaleなどをいれました。
そのときに、linterとformatterは指定しましたが、補完がほしいです。
ということで、dein.tomlに以下の記述をしました。

[[plugins]] # lspでの補完  
repo = 'prabirshrestha/async.vim'  

[[plugins]] # lspでの補完  
repo = 'prabirshrestha/vim-lsp'  
hook_add='''  
if executable('clangd-6.0')  
    au User lsp_setup call lsp#register_server({  
        \ 'name': 'clangd',  
        \ 'cmd': {server_info->['clangd-6.0']},  
        \ 'whitelist': ['c', 'cpp', 'objc', 'objcpp'],  
        \ })  
endif  
if executable('pyls')  
    au User lsp_setup call lsp#register_server({  
        \ 'name': 'pyls',  
        \ 'cmd': {server_info->['pyls']},  
        \ 'whitelist': ['python'],  
        \ })  
endif  
let g:lsp_diagnostics_enabled = 0 "w0rp/aleで対応するので無効化  
'''  

[[plugins]] # lspでの補完  
repo='prabirshrestha/asyncomplete.vim'  

[[plugins]] # lspでの補完  
repo='prabirshrestha/asyncomplete-lsp.vim'  

clangdとpylsは、前々々回の記事で追加したLSP、
つまりsudo apt install clang-toolspip3 install --user python-language-server
によるものです。
ここではclangd-6.0となっていますが、実際にはターミナル上でのコマンド名のことなので、
バージョンによる差異があると思います。
-6.0がついていなかったり、違う数字かもしれないので、そこは各自で合わせましょう。
f:id:hideharu092:20190326140144j:plain
こんな感じになります。前回の記事で追加したaleもしっかり動いてます。
他の補完も入れているので、実際にはちょっと違うかもしれません。

deinのtomlでMarkdown

Markdownの編集をサポートするために、
dein_lazy.toml(遅延読み込みの方のファイル)に、以下のように記述しています。

# ----Markdownサポート----  
[[plugins]] # Markdownの編集をサポート  
repo = 'plasticboy/vim-markdown'  
on_ft = 'md'  
hook_add = '''  
    let g:vim_markdown_folding_disabled=1  
'''  

[[plugins]]  
repo = 'godlygeek/tabular'  
on_ft = 'md'  

[[plugins]] # テーブルの生成  
repo = 'dhruvasagar/vim-table-mode'  
on_ft = 'md'  

[[plugins]] # プレビューをブラウザで開く  
repo = 'tyru/open-browser.vim'  
on_ft = 'md'  
hook_add = '''  
    if filereadable('/proc/sys/fs/binfmt_misc/WSLInterop')  
        autocmd vimrc BufNewFile,BufRead *.md nnoremap <buffer><Leader>p :execute "OpenBrowser" substitute(expand("%:p"), '/mnt/c', 'c:/', '')<CR>  
    else  
        autocmd vimrc BufNewFile,BufRead *.md nnoremap <buffer><Leader>p :execute "OpenBrowser" expand("%:p")<CR>  
    endif  
'''  

vim-markdownはシンタックスハイライトです。
tabularとvim-table-modeで、表の生成をサポートしています。
最初に:TableModeToggleでテーブルモードに入ると、
それ以降はtmでテーブルモードの切り替えができます。
ただこのコマンドが長いので、:TMに省略しています。

普通にtmで切り替えられました。

テーブルモードでは、『|』パイプを入力することで、自動的に表を整えてくれます。
幅も自動で合わせてくれるので、かなり楽です。
f:id:hideharu092:20190326140304p:plain

mdファイルのプレビューは、open-browser.vimとGoogle Chromeで行っています。
私の環境でWSLからはうまくファイルが開けなかったので、
WSLのときのみ、ファイルパスを適切に置換してから開いています。

Markdownでは、半角スペース2つで改行を表すのですが、自分でいちいち入力するのでは手間です。
そこで、vimrcに以下のように記述しています。

" ----Markdownのための設定  
function! MarkdownEOLTwoSpace()  
    let s:tmppos = getpos(".") " cursorの位置を記録しておく  
    " 行末に改行のための空白2つのみを付与(空行には付与しない)  
    %s/\v(\S\zs(\s{,1})|(\s{3,}))$/  /e  
    call setpos(".", s:tmppos) " cursorの位置を戻す  
endfunction  
autocmd vimrc BufWritePre *.md :call MarkdownEOLTwoSpace()  

前回の記事で出てきた、autocmdを利用して、ファイルを書き込みする前に、
それぞれの行末に半角スペース2つを付与しています。

実際には、正規表現を利用して、ファイル全体に置換をかけているだけです。
『%』がファイル全体。
『s/hoge/fuga』でhogeをfugaに置換。
これの後ろに『/e』を加えると、hogeという文字列が存在しなかったときにerrorにならない。
『\v』でvery magicをオンにし、『{}』などの記号の前に『\』をつけなくてもいいようにしています。
『\S』は空白以外の文字。
『\zs』はその後ろからが置換対象ということです。
『\s』は空白を意味します。
『{,1}』『{3,}』はその前の文字が1文字以下または3文字以上ということです。
『$』は行末を表します。

したがって、%s/\v(\S\zs(\s{,1})|(\s{3,}))$/ /eは、
ファイル全体のそれぞれの行に対して、以下の処理をします。
- 空行(その行は改行のみ)だったら、そのまま(置換しない)
- 文字列のあとに半角スペース2つで行末(改行)だったら、そのまま(置換しない)
- 文字列のあとに半角スペース0つで行末(改行)だったら、半角スペース2つを行末に付与
- 文字列のあとに半角スペース1つで行末(改行)だったら、行末の半角スペース1つを2つに置換
- 文字列のあとに半角スペース3つ以上で行末(改行)だったら、行末の半角スペースを2つだけに置換

これで、自分でいちいち改行のために半角スペース2つを入力しなくて済みますし、
すでに半角スペース2つがすでに行末にある行はそのままになります。

ちなみに、空行の判定をしないと、半角スペース2文字に置換されてしまうので、
表を書いても前後に空行がなくなってしまうのでうまく表示できません。

なんちゃらposの部分は、置換するとカーソル位置が変わってしまうので、
一度記録してから置換後にまた戻す、という作業をしています。

Markdownファイルのプレビューについて

open-browser.vimでファイルをブラウザで見れるようにしていますが、
間違ってシェルスクリプト等のファイルでキーマップが有効になっていると、えげつないことになるからです。
なので、上記のvimrcのように、
vimrc BufNewFile,BufRead *.md nnoremap <buffer><Leader>p :execute "OpenBrowser" substitute(expand("%:p"), '/mnt/c', 'c:/', '')<CR>
で、拡張子がmdのファイルだけブラウザでのプレビューするキーマップを有効にしています。

また、Google Chromeの場合には、『Markdown Preview Plus』という拡張機能を入れ、
以下の設定をすると良いです。
- 拡張機能の管理から、ファイルの URL へのアクセスを許可するをオンにする
- 拡張機能のアイコンをクリックしてオプションを開き以下を設定
- on Enable auto-reload
- supported file extensionsでは以下のみにチェック
- md, markdown, mdown,mkd,rmd
Markdown Preview Plusは、その名の通り、Markdownファイルをブラウザでプレビューしたときに、
自分でCSSで見やすくしたり、自動更新をしてくれる拡張機能です。

さらに、『Vimium』をという拡張機能を入れ、
以下の設定をすると良いです。
- 拡張機能の管理で、、ファイルの URL へのアクセスを許可するをオンにする
- Chromeの検索エンジンの設定で以下のように追加する。
f:id:hideharu092:20190326140747p:plain

VimiumはVimのキーバインドでネットサーフィンできるスグレモノです。
自分で色々設定もできます。
この拡張機能だけで、記事一本書けちゃいます。というか書きたいです。
検索エンジンの設定をしたのは、アドレスバーに間違ってフォーカスを移したときに、
フォーカスをwebページに戻すためです。
上記の例だったら、アドレスバーにフォーカルがあるときに『j』を打ちこんで、
出てきた選択肢をそのままEnterすれば、フォーカスがwebページに戻ります。
f:id:hideharu092:20190326140341p:plain

この2つの拡張機能を入れれば、
キーマップでMarkdownファイルをChromeで開く
→jやkなどのvimキーバインドのままスクロール
→Alt+Tabなどでvimにフォーカスを戻す
→vimで修正
→Chromeにフォーカスを移さなくても自動更新

という有史以来のVimのMarkdown快適環境が出来上がります。

Markdownファイルのプレビューには、htmlに変換してから見るものもあるんですが、
勝手にhtmlを作られるのが嫌なので、私はこのようにしているのです。

最後に

以上になります。
記事の冒頭にも書きましたが、私のvimrcやdein.toml、dein_lazy.tomlはGithubで公開しているので、
良ければご覧ください。
私のdotfiles

感想

最初に想定していたよりもかなり長くなってしまった。
もし同じような環境を想定しているような人が、参考にしてくれたら嬉しいなぁ。
文章をまとめる力をもっと伸ばしたい!
ちなみに、この記事は、上記で紹介したようなMarkdown環境で書いています!
使いたいvimの機能がいっぱいあるのでまだまだdotfilesは育て中です。