対象
- vimが好き
- コンパイルが面倒
- シェルで作業してる人
概要
latexやsassなど主にコンパイルが面倒なものは自動コンパイルがそもそも実装されています。
latexであれば$ latexmk -pvc sample.tex
sassであれば$ sass --watch sample.scss:sample.css
ファイルの変更を自動で読み、コンパイル、エラー文を吐いてくれます。
しかし、毎回編集を行う前に打ち込むのは面倒。
今回はコンパイルを自動化していきます。
vimでファイルタイプごとに設定を分ける。
vimには拡張子ごとに設定ファイルを分ける機能が標準装備されています。
filetypeを指定することによってそれが可能になります。
詳しく知りたい方は公式リファレンスをクリックしてみてください。
今回は拡張子がtexとscssのものを扱っています。
filetype plugin on
augroup fileTypeSet
autocmd!
autocmd BufNewFile,BufRead *.scss setfiletype scss
augroup END
letg:tex_flavor='latex'
vimのaugroup内でファイルを開いた時の設定を記述することができます。上記のようにすると拡張子がscssの場合、filetypeとしてscssを読み込む。という意味になります。
またtexをfiletypeとして指定するとき一つ注意点があり、texは元々vimのグローバル変数の設定からfiletypeを振り分けることができるようになっています。
だから新しく追記する代わりに変数に代入してやります。
vimはruntimepathに設定しているファイルを読みに行くのでここはおとなしく標準で設定されている~/.vim/ftplugin以下に拡張子ごとの設定ファイルを置いていきます。
ftpluginはなければ自分で作成します。sassの例を加えるならば以下の二つを追加します。
- ~/.vim/ftplugin/scss.vim
- ~/.vim/ftplugin/tex.vim
設定を記述する
vimではコマンドラインモードで:!を用いることによってシェルのコマンドを実行することができます。コンパイル後のファイルがカレントディレクトリになるよう :lcd %:h
で編集中ファイルのディレクトリに移動し、 :!latexmk %:p
でファイル保存時にlatexをオートでコンパイルするようにしました。%:pには編集ファイルのフルパスが入ります。
autocmd BufWritePost * :lcd %:h|:!latexmk %:p
これはこれで動いたのですがここで僕はそもそもこんな少量でいいんだったらそのままvimrcにかけばよくね?となりました。
最終的な着地点
現在僕のvimrcはこのようになっています。
Rとlatexとc言語のコンパイルを行えるようにしています。
filetype plugin on
augroup setAutoCompile
autocmd!
autocmd BufWritePost *.tex :lcd %:h|:!latexmk %:p
autocmd BufWritePost *.c:lcd %:h|:!gcc %:p
autocmd BufWritePost *.cpp :lcd %:h|:!g++-std=c++14 %:p
autocmd BufWritePost *.R :lcd %:h|:!R -f %:p
augroup END
これでまたvimrcが強くなりましたね。
メリット
- 保存時にエラー文が見れるので楽
- コンパイルする手間が省ける(競技プログラミングに強い)
デメリット
- 壊れたコードのままうかつに保存すると大量のエラー文がでる(逆に言えばコンパイルできないコードの状態で保存しないくせがつく...??)