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

vimで保存時に自動コンパイル

$
0
0

対象

  • vimが好き
  • コンパイルが面倒
  • シェルで作業してる人

概要

latexやsassなど主にコンパイルが面倒なものは自動コンパイルがそもそも実装されています。
latexであれば
$ latexmk -pvc sample.tex
sassであれば
$ sass --watch sample.scss:sample.css
ファイルの変更を自動で読み、コンパイル、エラー文を吐いてくれます。
しかし、毎回編集を行う前に打ち込むのは面倒。
今回はコンパイルを自動化していきます。

vimでファイルタイプごとに設定を分ける。

vimには拡張子ごとに設定ファイルを分ける機能が標準装備されています。
filetypeを指定することによってそれが可能になります。
詳しく知りたい方は公式リファレンスをクリックしてみてください。
今回は拡張子がtexとscssのものを扱っています。

~/.vimrc
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には編集ファイルのフルパスが入ります。

~/.vim/ftplugin/tex.vim
autocmd BufWritePost * :lcd %:h|:!latexmk %:p

これはこれで動いたのですがここで僕はそもそもこんな少量でいいんだったらそのままvimrcにかけばよくね?となりました。

最終的な着地点

現在僕のvimrcはこのようになっています。
Rとlatexとc言語のコンパイルを行えるようにしています。

~/.vimrc
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が強くなりましたね。

メリット

  • 保存時にエラー文が見れるので楽
  • コンパイルする手間が省ける(競技プログラミングに強い)

デメリット

  • 壊れたコードのままうかつに保存すると大量のエラー文がでる(逆に言えばコンパイルできないコードの状態で保存しないくせがつく...??)

Viewing all articles
Browse latest Browse all 5608

Trending Articles



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