forked from aniani/vim
		
	
		
			
				
	
	
		
			154 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			154 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/perl -w
 | |
| 
 | |
| # vimparse.pl - Reformats the error messages of the Perl interpreter for use
 | |
| # with the quickfix mode of Vim
 | |
| #
 | |
| # Copyright (©) 2001 by Jörg 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;
 | |
| 
 | |
| };
 |