Use the package name to infer module location. This will make it easier to script our maintaining tasks.
102 lines
2.1 KiB
Perl
Executable file
102 lines
2.1 KiB
Perl
Executable file
#!/usr/bin/perl
|
|
# vim:set ft=perl ts=4 sw=4 et fdm=marker:
|
|
#
|
|
# revim - add customized vim modeline for given files
|
|
# Copyright (c) 2010 chaoslawful
|
|
|
|
use strict;
|
|
use warnings;
|
|
use Getopt::Std;
|
|
|
|
my %opts;
|
|
|
|
getopts('hm:', \%opts);
|
|
|
|
if($opts{h} or !@ARGV) {
|
|
die <<EOT;
|
|
Usage: revim [-m <vim modeline>] src/*
|
|
|
|
In <vim modeline>, the following placeholder(s) can be used:
|
|
|
|
* %t - Expands to vim file type. E.g. 'c' for .c files, 'perl' for .pl files.
|
|
EOT
|
|
}
|
|
|
|
my $vim_ml = $opts{m} || "vim:set ft=%t ts=4 sw=4 et fdm=marker:";
|
|
my @files = map glob, @ARGV;
|
|
for my $file (@files) {
|
|
next if -d $file;
|
|
my ($ft, $ml) = detect_filetype($file, $vim_ml);
|
|
next if !defined($ft);
|
|
revim($file, $ml);
|
|
}
|
|
|
|
sub detect_filetype
|
|
{
|
|
my ($f, $tmpl) = @_;
|
|
my ($ft, $lcmt, $rcmt);
|
|
my %phs;
|
|
|
|
if($f =~ /.([cC]|[hH])$/) {
|
|
$ft = "c";
|
|
($lcmt, $rcmt) = ("/* ", " */");
|
|
} elsif($f =~ /.(pl|pm)$/) {
|
|
$ft = "perl";
|
|
($lcmt, $rcmt) = ("# ", "");
|
|
} elsif($f =~ /.t_?$/) {
|
|
# assuming tests are written in perl
|
|
$ft = "perl";
|
|
($lcmt, $rcmt) = ("# ", "");
|
|
} else {
|
|
$ft = undef;
|
|
}
|
|
|
|
if(defined($ft)) {
|
|
%phs = (
|
|
"%t" => $ft,
|
|
);
|
|
|
|
$tmpl =~ s/(%[a-z])/$phs{$1}/ge;
|
|
$tmpl =~ s/^/$lcmt/;
|
|
$tmpl =~ s/$/$rcmt/;
|
|
|
|
return ($ft, $tmpl);
|
|
}
|
|
|
|
return (undef, undef);
|
|
}
|
|
|
|
sub revim
|
|
{
|
|
my ($f, $ml) = @_;
|
|
my @lines;
|
|
|
|
open my $in, $f
|
|
or die "Can't open $f for reading: $!";
|
|
while(<$in>) {
|
|
push(@lines, $_);
|
|
}
|
|
close $in;
|
|
|
|
my @nlines = grep {!/\bvim?:/} @lines;
|
|
warn "revim: $f:\tremoved existing vim modeline.\n"
|
|
if(@nlines != @lines);
|
|
|
|
if($nlines[0] =~ /^#!/) { # has shebang line
|
|
my $shebang = shift @nlines;
|
|
unshift(@nlines, $shebang, "$ml\n");
|
|
} else {
|
|
unshift(@nlines, "$ml\n");
|
|
}
|
|
|
|
my $text = join '', @nlines;
|
|
|
|
open my $out, "> $f"
|
|
or die "Can't open $f for writing: $!";
|
|
binmode $out;
|
|
print $out $text;
|
|
close $out;
|
|
|
|
warn "revim: $f:\tdone.\n";
|
|
}
|
|
|