syntastic と Project::Libs でよしなにする話

vim plugin で syntastic という色々な言語の syntax check をしてくれるものがある

最近追ってなくて昔は syntax check をするスクリプトの設定が出来なかったので syntastic 側の perl の syntax check 周りの関数を読みこませないで時前のを読み込ますなどしてた

けどさっき見たら指定できるようになってたので

let g:syntastic_perl_efm_program = "perl " . path/to/file

として、

use strict;
use warnings;

use Getopt::Long;

die "no arguments" unless @ARGV;

my @libs;

GetOptions("libdir" => \@libs);

my $file = shift;
my $args = @ARGV ? " " . join " ", @ARGV : "";
my $libs_str = join " ", @libs;

my @lines = `perl -cw -M'Project::Libs lib_dirs => [qw/$libs_str/]' $file$args 2>&1`;

for my $line (@lines) {

    chomp $line;

    if ( $line =~ /^(.*)\sat\s(.*)\sline\s(\d+)(\.|,\snear\s\".*\")$/ ) {

        my ($message, $file, $lineno, $rest) = ($1, $2, $3, $4);
        $message .= $rest if $rest =~ s/^,//;
        print "E:$file:$lineno:$message\n";

    }

}

のように Project::Libs を使って syntax check したものを指定されたフォーマットで吐くようにした。ちなみに E:.... って書くと error、W:... って書くと warning として表示されるけどめんどくさいので全部 E:... とした

これでどのディレクトリでファイルを開こうとよしなにやってくれるので便利ですね。