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 | 目次を開く |
\lv | PDFファイルをビューワで開く |
\ll | コンパイルする |
\le | エラー一覧(QuickFixリスト)を開く |
K | 解説ドキュメントをブラウザで開く |
\lt
, \lv
, \ll
, \le
の\
は本当は<LocalLeader>
というやつだけれど、特に変更する設定を.vimrc
などでしていない限り\
である。「目次を開く」が\lt
なのはtable of contentsだから。\ll
の最後のl
はlatex
から来ているのだろうか。\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
と入力する行為には快感がある2。t
はtoggleである。個々の具体的な動作は、使えばわかります。tsd
とはなんでしょうね?
あと、テキスト中のTeXファイル特有のオブジェクトを指定するためのもの。
キー | 動作 |
---|---|
ac | コマンド全体を指定する |
ad | 括弧で囲まれた部分全体を指定する |
ae | 環境全体を指定する |
a$ | インライン数式全体を指定する |
aP | セクション全体を指定する |
これらは「オペレータコマンド」と組み合わせて使う。具体的な使い方はおそらく、d
で削除(たとえばdae
で環境全体を削除)、y
でコピー、v
で選択、という3種類しかないような気がする。なお、ac
でなくic
などとするとinclusiveな指定になる。
インサートモードで使えるLaTeXコマンドの短縮形というのもあるが、使わないのでこの機能は切った。
let g:vimtex_imaps_enabled = 0
「普通に入力するつもりでいたら補完機能が助けてくれた」というのがいいのであって、個々のコマンドごとに新しい入力法を覚えるようなことはしたくないのだ。