松本佳彦のノート

lervag/vimtexが良い

2018年4月28日

普段の原稿は主にTeXで、それをVimで書いている。Vim用のTeXプラグインはいくつかあるけれど、Karl Yngve Lervågさんのvimtexがシンプルにまとまっていて好きだ。「vimtex」という名称はあまりに個性が薄いので、ここでは「lervag/vimtex」と書くことにする。

ユーザーとして、基本的には「ファンシーな機能はいらない、補完をばっちりやってほしい」と思う。そしてlervag/vimtexはそれに応えてくれる。neocompleteなどのプラグインを合わせて使うと、補完候補一覧が適宜自動で表示されるようにできて(つまりMicrosoft Visual StudioのIntellisenseのような動作)、極楽ができあがる。そして、「ファンシーな機能はいらないと言ったけれど、この人の作るものなら使ってみるか」と他の機能にも少しずつ手を出す。

ヘルプも良く書かれていて素晴らしい。

なお、次のページも参考になります。

補完

lervag/vimtexは以下のものをVimの「オムニ補完」候補に追加する。オムニ補完の候補一覧は、標準では、インサートモードでCtrl-X Ctrl-Oと入力すれば現れる。

補完対象内容
コマンド名\を入力すると補完が始まる。対象となるコマンドは、標準のものに加え、\usepackageで読み込んだTeXパッケージに基づき追加される。対応パッケージはこのディレクトリにあるとおり豊富。
ラベル名\labelで作成したラベルを、\ref{\eqref{に続けて補完する。auxファイルに基づき行われるので、\labelを記述したあとに一度コンパイルしておく必要がある。
文献キー参考文献キーを\cite{に続けて補完する。補完候補はbibファイルとthebibliography環境から取得される。候補を検索するための入力は、文献キー自体でもいいし、タイトルや著者名などでもいい。
ファイルパス\includegraphics{に続けてファイルパスを補完する。

とりあえずこのくらいにするが、他にもある。

Ctrl-X Ctrl-Oで使ってもよいが、neocompleteまたはdeopleteとの併用がおすすめ1

neocomplete, deoplete自体の使い方についてはここでは触れない。一通り整備するまではちょっと大変だけど、やる価値はあります。

neocomplete, deopleteにlervag/vimtexに対応した動作をさせるための設定として、たとえばneocompleteであれば、lervag/vimtex側のヘルプにあるように、.vimrcに次のように書く。

if !exists('g:neocomplete#sources#omni#input_patterns')
  let g:neocomplete#sources#omni#input_patterns = {}
endif
let g:neocomplete#sources#omni#input_patterns.tex = g:vimtex#re#neocomplete

環境補完は別途対応

なお、lervag/vimtexでは環境の補完はできないものと思われる。環境というのは

\begin{kankyou}
  ほげほげ
\end{kankyou}

みたいなやつ。これに関しては、自分はスニペットファイルを自作してneosnippetプラグインで利用している。一般的な設定に加えて、次を.vimrcに追記する(スニペットファイルを~/.vim/snippets/に置く場合)。

let g:neosnippet#disable_runtime_snippets = { 'tex' : 1 }
let s:my_snippet='~/.vim/snippets/'
let g:neosnippet#snippets_directory = s:my_snippet

この自作スニペットファイルはLaTeX2e標準の環境とamsmath, amscd, amsthmで定義された環境にしか対応していない。当初はすぐに拡張しようと思っていたのだが、なんとなく、これでも十分便利で、そのままにし続けてしまっている。

コンパイル

コンパイルは以前はlatexmkを普通に呼び出していたが、思い立ってこれもlervag/vimtexでやるように設定してみたら、素晴らしかった。lervag/vimtexも内部では結局(標準では)latexmkで処理するのだが、エラーが見やすい形で「QuickFixリスト」というVim内のウィンドウに表示されるのがいい。

latexmkをコマンドラインで普通に使えるようセットアップする。その上で、lervag/vimtexの設定として、.vimrcに次のように書いた。

let g:vimtex_compiler_progname = '/Applications/MacVim.app/Contents/bin/gvim'
let g:vimtex_compiler_latexmk = { 'continuous' : 0 }
let g:vimtex_quickfix_open_on_warning = 0

第1行はMacVimユーザーなので指定するが、一般的には不要らしい。

第2行はlatexmkの連続モード(texファイルに変更があるたびに自動でコンパイルするモード)に関するもの。

lervag/vimtexはそれを標準としているが、自分の好みではないので切った。

第3行は、コンパイル結果のエラーメッセージにerrorがなくwarningだけである場合、メッセージを表示しないという設定。

コンパイルは、ノーマルモードで\llで実行できる。ただし個人的歴史的理由によりCtrl-Cで実行したい。

そこで次のようにする。

augroup set_latex_compiler
  autocmd!
  autocmd BufNewFile,BufRead *.tex nmap <C-c> <plug>(vimtex-compile)
augroup END

QuickFixリストが表示されている際の基本的な操作は次のとおり。リストに並んだエラーのうち、たとえば7番目のエラーに対応する行へとジャンプするには:cc 7とする。あるいはCtrl-W jでQuickFixリストに移動した後、目的のエラーを示す行でEnterしてジャンプ。:ccloseでリストを閉じる。

いくつかの標準キーマッピング

その他の機能はあまり求めていない——つもりだったが、少しずつ使えるようになると、悪くない感じがしてくる。初めは無理せず、好きなものがあれば一つ二つ使ってみる程度で入っていくのがいいと思う。以下に自分が慣れているもの、慣れたいと思うものを示す。ここに示したものはすべてノーマルモードで使う。

まず、何と言えばいいかわからないが、高所からの操作に関するもの。

キー動作
\lt目次を開く
\lvPDFファイルをビューワで開く
\llコンパイルする
\leエラー一覧(QuickFixリスト)を開く
K解説ドキュメントをブラウザで開く

\lt, \lv, \ll, \le\は本当は<LocalLeader>というやつだけれど、特に変更する設定を.vimrcなどでしていない限り\である。「目次を開く」が\ltなのはtable of contentsだから。\llの最後のllatexから来ているのだろうか。\lt, \lv, \ll, \leに共通する2文字目のlの出自は謎。

Kは面白い。コマンドや環境の上で入力すると、関係するパッケージ等の解説をブラウザで開いてくれる。うまく活用したことはまだないけど、面白いので入れました。

次は移動に関するもの。「マッチするペア」というのは、\begin{kankyou}\end{kankyou}や、対応する括弧などのことを指す。

キー動作
%マッチするペアに移動する
]], [[次の(前の)セクションに移動する

細かな編集に関するもの。これらがかなり便利。

キー動作キー動作キー動作
cse環境を変更するtse環境のスター有無を切り替えるdse環境を削除する
cscコマンドを変更するtscコマンドのスター有無を切り替えるtsdコマンドを削除する
csd括弧を変更するtsd括弧の修飾の有無を切り替えるdsd括弧を削除する

eはenvironment、 dはdelimiterから来ている。「Change, surrounding, environment!」と頭の中で唱えながらcseと入力する行為には快感がある2tはtoggleである。個々の具体的な動作は、使えばわかります。tsdとはなんでしょうね?

あと、テキスト中のTeXファイル特有のオブジェクトを指定するためのもの。

キー動作
acコマンド全体を指定する
ad括弧で囲まれた部分全体を指定する
ae環境全体を指定する
a$インライン数式全体を指定する
aPセクション全体を指定する

これらは「オペレータコマンド」と組み合わせて使う。具体的な使い方はおそらく、dで削除(たとえばdaeで環境全体を削除)、yでコピー、vで選択、という3種類しかないような気がする。なお、acでなくicなどとするとinclusiveな指定になる。

不要な動作を切る

インサートモードで使えるLaTeXコマンドの短縮形というのもあるが、使わないのでこの機能は切った。

let g:vimtex_imaps_enabled = 0

「普通に入力するつもりでいたら補完機能が助けてくれた」というのがいいのであって、個々のコマンドごとに新しい入力法を覚えるようなことはしたくないのだ。

  1. deopleteは以前Neovim専用だったので、Neovimに移行していない自分はneocompleteユーザーだったが、いつのまにかdeopleteがVim 8に対応していた。これから試してみる。
  2. そんなことを考える間もなく入力できるようになったほうがいいという意見もあるだろうが気にしない。