【Vim】syntastic + vim-rooter で構文チェック


ファイルを保存したときに自動的にコンパイル・構文チェックをする方法として以前次のような記事を書きました。

【Vim】errormarker.vim + Project::Libs で構文チェック – blog.delphinus.dev
https://blog.delphinus.dev/2012/02/errormarker-and-project-libs.html

その後、vim なら syntastic というプラグインがすごいという話を聞きましたので、いろいろ試してみました。こいつは C, Java, Perl, PHP, Ruby, Python, HTML, Javascript, ……等々、とにかく多数の言語の構文チェックに対応していることが特徴です。

Syntastic – Automatic syntax checking : vim online
http://www.vim.org/scripts/script.php?script_id=2736
scrooloose/syntastic
https://github.com/scrooloose/syntastic/

120818-0001.png

インストールは例によって、.vimrcBundle 'scrooloose/syntastic' と書いた後、:BundleInstall するだけで ok です。(vundle 利用者の場合)

ファイルを保存するときに勝手に構文チェックが走り、右の画像のような感じで、エラーのあった箇所と内容について知らせてくれます。

エラーリストが表示されないときは、:Errors とか :lope とかしてみてください。

Perl で独自ライブラリをチェックする

主に僕はこれを Perl の構文チェックに使っていたのですが、次のように書いているときにうまくチェックできないことがありました。

#!/usr/bin/env perl
use strict;
use warnings;
use lib './lib';
use MyLib; # このモジュールが見つからない!
my $app = MyLib->new;

use lib で外部ライブラリが相対パスで指定してある場合、MyLib が見つからないと怒られてしまいます。

こういうときは syntastic のオプションを使います。

" perl -I/home/delphinus/git/myproject/lib $file するのと一緒
let g:syntastic_perl_lib_path = '/home/delphinus/git/myproject/lib'

しかし、コレでは複数の -I を指定したい場合に対応できません。そのままでは難しかったので pull request 送っちゃいました。

→ 最新版ではこのパッチが取り込まれています。

Pull Request #319: [Perl] enable to specify multiple external libs by delphinus35 · scrooloose/syntastic
https://github.com/scrooloose/syntastic/pull/319/files

このパッチを適用すると、次のような書式が使えます。

" perl -I/home/delphinus/git/myproject/lib -I/opt/perl/lib $file するのと一緒
let g:syntastic_perl_lib_path = '/home/delphinus/git/myproject/lib,/opt/perl/lib'

vim-rooter でカレントディレクトリを移動する

もう一つの解決法は、カレントディレクトリをファイルの置いてあるパスに設定することです。

たとえば、ファイルを開くたびにカレントディレクトリを移動してくれるように設定するには次のようにします。(set autochdir というオプションもありますが、あれは基本的に deprecated です。)

autocmd BufEnter * execute 'execute ' . escape(expand('%:p:h'), ' \')

しかし、カレントディレクトリに移動しただけでは困る場合があります。以下のようなファイル構成の場合には対応できません。

myproject --+-- lib    ----- MyApp.pm
            |
            +-- script ----- myapp.pl
            |
            +-- t      --+-- lib ----- MyTest.pm
                         |
                         +-- 00-sample.t
use strict;
use warnings;
use Test::More;
use lib './t/lib';
use MyTest; # このモジュールが見つからない!
ok 1 == 1;

よくありますよね。こういうテスト。そこでオススメなのが、vim-rooter というプラグインです。

rooter – Changes the working directory to the project root when you open a file. : vim online
http://www.vim.org/scripts/script.php?script_id=4145
airblade/vim-rooter
https://github.com/airblade/vim-rooter/

このプラグインを導入すると、親ディレクトリを遡り、プロジェクトのトップっぽいところに着いたらそこをカレントディレクトリにします。

「トップっぽい」.git などの、バージョン管理システムの特殊フォルダがあるかどうかで判別します。Git、Darcs、Mercurial、Bazaar、SVN に対応しているそうです。

基本的に、インストールするだけで何もしなくともカレントディレクトリが勝手に移動するようになるのですが、細かく制御したいときはファイルタイプごとに設定できます。

" \cd でカレントディレクトリを移動(デフォルト)
map <silent> <unique> <Leader>cd <Plug>RooterChangeToRootDirectory
" 一旦全部削除
autocmd! rooter
" 標準では以下の拡張子で自動的に起動
autocmd BufEnter *.rb,*.html,*.haml,*.erb,*.rjs,*.css,*.js :Rooter
" cd の代わりに lcd を使う
let g:rooter_use_lcd = 1

動作したいファイルタイプを増やすときは上記のように autocmd コマンドを使う手もありますが、僕の場合は .vim/ftplugin/nantara.vimRooter とだけ書いて設定しています。いらなくなったらファイルごと削除するだけです。

" ファイルタイプが perl の時だけ vim-rooter を使う
Rooter

チェックに時間がかかる場合には……

標準ではファイルを保存するたびに構文チェックが走ります。非常に大きなモジュールを use している場合など、構文チェックのたびに数十秒待たされることも珍しくありません。

構文チェックで vim 自体が固まった場合は Ctrl + C で中断することが出来ます。構文チェックを自動・手動で切り替えるときは、

:SyntasticToggleMode

コレで切り替えることが出来ますし、手動モードの時に実行するときは次のコマンドを使います。

:SyntasticCheck

これらを適当なキーに割り当てると便利でしょう。

チェックを非同期に行う

そもそも、構文チェックを非同期に行ってくれれば解決するんですけどね。コレについては既に pull request されているみたいですが、半年も放置されています。

Pull Request #146: Make async make and load errors by nevar · scrooloose/syntastic
https://github.com/scrooloose/syntastic/pull/146

僕は今のところ、上記の手動実行でことは足りている(チェック中は screen を切り替えて別の作業をする)のですが、気になる方は上記パッチを試してはいかがでしょうか。

One thought on “【Vim】syntastic + vim-rooter で構文チェック

コメントを残す