123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- #!/usr/bin/perl -w
- # vimparse.pl - Reformats the error messages of the Perl interpreter for use
- # with the quickfix mode of Vim
- #
- # Copyright (c) 2001 by Joerg Ziefle <joerg.ziefle@gmx.de>
- # You may use and distribute this software under the same terms as Perl itself.
- #
- # Usage: put one of the two configurations below in your ~/.vimrc (without the
- # description and '# ') and enjoy (be sure to adjust the paths to vimparse.pl
- # before):
- #
- # Program is run interactively with 'perl -w':
- #
- # set makeprg=$HOME/bin/vimparse.pl\ %\ $*
- # set errorformat=%f:%l:%m
- #
- # Program is only compiled with 'perl -wc':
- #
- # set makeprg=$HOME/bin/vimparse.pl\ -c\ %\ $*
- # set errorformat=%f:%l:%m
- #
- # Usage:
- # vimparse.pl [-c] [-f <errorfile>] <programfile> [programargs]
- #
- # -c compile only, don't run (perl -wc)
- # -f write errors to <errorfile>
- #
- # Example usages:
- # * From the command line:
- # vimparse.pl program.pl
- #
- # vimparse.pl -c -f errorfile program.pl
- # Then run vim -q errorfile to edit the errors with Vim.
- #
- # * From Vim:
- # Edit in Vim (and save, if you don't have autowrite on), then
- # type ':mak' or ':mak args' (args being the program arguments)
- # to error check.
- #
- # Version history:
- # 0.2 (04/12/2001):
- # * First public version (sent to Bram)
- # * -c command line option for compiling only
- # * grammatical fix: 'There was 1 error.'
- # * bug fix for multiple arguments
- # * more error checks
- # * documentation (top of file, &usage)
- # * minor code clean ups
- # 0.1 (02/02/2001):
- # * Initial version
- # * Basic functionality
- #
- # Todo:
- # * test on more systems
- # * use portable way to determine the location of perl ('use Config')
- # * include option that shows perldiag messages for each error
- # * allow to pass in program by STDIN
- # * more intuitive behaviour if no error is found (show message)
- #
- # Tested under SunOS 5.7 with Perl 5.6.0. Let me know if it's not working for
- # you.
- use strict;
- use Getopt::Std;
- use vars qw/$opt_c $opt_f $opt_h/; # needed for Getopt in combination with use strict 'vars'
- use constant VERSION => 0.2;
- getopts('cf:h');
- &usage if $opt_h; # not necessarily needed, but good for further extension
- if (defined $opt_f) {
- open FILE, "> $opt_f" or do {
- warn "Couldn't open $opt_f: $!. Using STDOUT instead.\n";
- undef $opt_f;
- };
- };
- my $handle = (defined $opt_f ? \*FILE : \*STDOUT);
- (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 $errors = 0;
- foreach my $line (@lines) {
- chomp($line);
- my ($file, $lineno, $message, $rest);
- if ($line =~ /^(.*)\sat\s(.*)\sline\s(\d+)(\.|,\snear\s\".*\")$/) {
- ($message, $file, $lineno, $rest) = ($1, $2, $3, $4);
- $errors++;
- $message .= $rest if ($rest =~ s/^,//);
- print $handle "$file:$lineno:$message\n";
- } else { next };
- }
- if (defined $opt_f) {
- my $msg;
- if ($errors == 1) {
- $msg = "There was 1 error.\n";
- } else {
- $msg = "There were $errors errors.\n";
- };
- print STDOUT $msg;
- close FILE;
- unlink $opt_f unless $errors;
- };
- sub usage {
- (local $0 = $0) =~ s/^.*\/([^\/]+)$/$1/; # remove path from name of program
- print<<EOT;
- Usage:
- $0 [-c] [-f <errorfile>] <programfile> [programargs]
- -c compile only, don't run (executes 'perl -wc')
- -f write errors to <errorfile>
- Examples:
- * At the command line:
- $0 program.pl
- Displays output on STDOUT.
- $0 -c -f errorfile program.pl
- Then run 'vim -q errorfile' to edit the errors with Vim.
- * In Vim:
- Edit in Vim (and save, if you don't have autowrite on), then
- type ':mak' or ':mak args' (args being the program arguments)
- to error check.
- EOT
- exit 0;
- };
|