Subscribed unsubscribe Subscribe Subscribe

ErrorMarker.vimでプロジェクトのlibディレクトリを自動的に@INCに追加する

VimでflymakeるためにErrorMarker.vimを使ってる人は多いと思う。

だけど、あれをPerlのプロジェクトで普通に使うと、プロジェクトのlibディレクトリやsubmoduleのディレクトリが@INCに入ってないので、モジュールをuseしてるところでエラーが出てしまう。
なので、libディレクトリを見つけて@INCに入れてくれるように、ErrorMarkerで使っているvimparse.plを(Project::LibsをCPANから入れた後で)以下のように修正する。

--- vimparse.pl.old        2011-12-25 22:19:36.000000000 +0900
+++ vimparse.pl 2011-12-26 00:01:48.000000000 +0900
@@ -63,6 +63,9 @@

 use strict;
 use Getopt::Std;
+use Cwd qw(getcwd);
+use Path::Class qw(file);
+use Project::Libs;

 use vars qw/$opt_c $opt_f $opt_h/; # needed for Getopt in combination with use strict 'vars'

@@ -86,7 +89,13 @@
 (my $file = shift) or &usage; # display usage if no filename is supplied
 my $args = (@ARGV ? ' ' . join ' ', @ARGV : '');

-my @lines = `perl @{[defined $opt_c ? '-c ' : '' ]} -w "$file$args" 2>&1`;
+my $path = "";
+my $current_dir = getcwd;
+my @inc = Project::Libs::find_inc(file($file)->dir->stringify, [qw(lib)], ());
+$path .= join ' ', map {"-I$_"} @inc if scalar @inc;
+chdir $current_dir;
+
+my @lines = `perl @{[defined $opt_c ? '-c ' : '' ]} -w $path "$file$args" 2>&1`;

 my $errors = 0;
 foreach my $line (@lines) {

これでいい感じに@INCが追加されるようになり、エラーが起きなくなる。

参考

これ使ったら楽勝だった。antipopさん++


ところで最近、Githubで人のdotfilesをのぞいてみてもErrorMarker.vimを使ってる人をほとんど見ない気がする。Vimでflymakeるのはもっとモダンな方法があるのかな? 知っている人がいたら教えてほしいです。