ファイルを保存したときに自動的にコンパイル・構文チェックをする方法として以前次のような記事を書きました。
【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/
インストールは例によって、.vimrc
に Bundle '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.vim
に Rooter
とだけ書いて設定しています。いらなくなったらファイルごと削除するだけです。
" ファイルタイプが 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 を切り替えて別の作業をする)のですが、気になる方は上記パッチを試してはいかがでしょうか。
g:syntastic_perl_lib_pathみたいにlocal::libも対応できるなおいいですね><