diff options
Diffstat (limited to 'scripts/grep.pl')
-rw-r--r-- | scripts/grep.pl | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/scripts/grep.pl b/scripts/grep.pl new file mode 100644 index 0000000..35ce15c --- /dev/null +++ b/scripts/grep.pl @@ -0,0 +1,82 @@ +# /GREP [-i] [-w] [-v] [-F] <perl-regexp> <command to run> +# +# -i: match case insensitive +# -w: only print matches that form whole words +# -v: Invert the sense of matching, to print non-matching lines. +# -F: match as a fixed string, not a regexp +# +# if you want /FGREP, do: /alias FGREP GREP -F + +use Irssi; +use strict; +use Text::ParseWords; +use vars qw($VERSION %IRSSI); +$VERSION = "2.1"; +%IRSSI = ( + authors => "Timo \'cras\' Sirainen, Wouter Coekaerts", + contact => "tss\@iki.fi, wouter\@coekaerts.be", + name => "grep", + description => "/GREP [-i] [-w] [-v] [-F] <perl-regexp> <command to run>", + license => "Public Domain", + url => "http://wouter.coekaerts.be/irssi/", + changed => "2008-01-13" +); + +my ($match, $v); + +sub sig_text { + my ($dest, $text, $stripped_text) = @_; + Irssi::signal_stop() if (($stripped_text =~ /$match/) == $v); +} + +sub cmd_grep { + my ($data,$server,$item) = @_; + my ($option,$cmd,$i,$w,$F); + $v = 0; + $F = 0; + + # split the arguments, keep quotes + my (@args) = "ewords(' ', 1, $data); + + # search for options + while ($args[0] =~ /^-/) { + $option = shift(@args); + if ($option eq '-i') {$i = 1;} + elsif ($option eq '-v') {$v = 1;} + elsif ($option eq '-w') {$w = 1;} + elsif ($option eq '-F') {$F = 1;} + else { + Irssi::print("Unknown option: $option",MSGLEVEL_CLIENTERROR); + return; + } + } + + # match = first argument, but remove quotes + ($match) = "ewords(' ', 0, shift(@args)); + # cmd = the rest (with quotes) + $cmd = join(' ',@args); + + # check if the regexp is valid + eval { qr/$match/ }; + if($@) { # there was an error + chomp $@; + Irssi::print($@,MSGLEVEL_CLIENTERROR); + return; + } + + if ($F) { + $match =~ s/(\(|\)|\[|\]|\{|\}|\\|\*|\.|\?|\|)/\\$1/g; + } + if ($w) { + $match = '\b' . $match . '\b'; + } + if ($i) { + $match = '(?i)' . $match; + } + + Irssi::signal_add_first('print text', 'sig_text'); + Irssi::signal_emit('send command', $cmd, $server, $item); + Irssi::signal_remove('print text', 'sig_text'); +} + +Irssi::command_bind('grep', 'cmd_grep'); |