# /GREP [-i] [-w] [-v] [-F] # # -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; my $HELP_SUMMARY = "GREP [-i] [-w] [-v] [-F] /irssi-command"; our $VERSION = "2.1"; our %IRSSI = ( authors => "Timo 'cras' Sirainen, Wouter Coekaerts, Tom Feist", contact => 'tss@iki.fi, wouter@coekaerts.be', name => "grep", description => $HELP_SUMMARY, license => "Public Domain", url => "http://wouter.coekaerts.be/irssi/", changed => "2012-02-02" ); my $HELP_TEXT = [ $HELP_SUMMARY, "", "The following options are supported:", " \x{02}-i\x{02}: match case insensitively", " \x{02}-w\x{02}: only print matches that form whole words", " \x{02}-v\x{02}: Invert the sense of matching, to print non-matching lines.", " \x{02}-F\x{02}: match as a fixed string, not a regexp", "", "Examples:", "", " \x{02}*\x{02} /GREP -i bacon /echo I LOVE BACON", "", "if you want /FGREP, do: /alias FGREP GREP -F" ]; my $match_pattern; my $match_count = 0; my $options = { }; sub sig_grep_text { my ($dest, $text, $stripped_text) = @_; if ($stripped_text =~ $match_pattern) { if (not $options->{'-v'}) { $match_count++; return; } } Irssi::signal_stop; } sub cmd_grep { my ($data, $server, $item) = @_; if ($data =~ m/^\s*$/) { Irssi::print("\x{02}GREP Error\x{02} Invalid arguments. " . "Usage: $HELP_SUMMARY", MSGLEVEL_CLIENTERROR); return; } $options = { map { $_ => 0 } qw/-i -v -w -F/ }; # split the arguments, keep quotes my @args = quotewords(' ', 1, $data); # search for options while ($args[0] =~ /^-\w/) { my $opt_arg = shift @args; if (exists $options->{$opt_arg}) { $options->{$opt_arg} = 1; } else { Irssi::print("Unknown option: $opt_arg", MSGLEVEL_CLIENTERROR); return; } } # match = first argument, but remove quotes my ($match_str) = quotewords(' ', 0, shift @args); print "Match string >>$match_str<<"; # cmd = the rest (with quotes) my $cmd = join(' ', @args); print "CMD >>$cmd<<"; if ($options->{'-F'}) { $match_str = quotemeta($match_str); } if ($options->{'-w'}) { $match_str = '\b' . $match_str . '\b'; } if ($options->{'-i'}) { $match_str = '(?i)' . $match_str; } $match_pattern = eval { qr/$match_str/; }; if ($@) { chomp $@; Irssi::print("\x{02}Invalid pattern\x{02}: $@", MSGLEVEL_CLIENTERROR); return; } $match_count = 0; Irssi::signal_add_first('print text', 'sig_grep_text'); Irssi::signal_emit('send command', $cmd, $server, $item); Irssi::signal_remove('print text', 'sig_grep_text'); if ($match_count > 0) { Irssi::print(sprintf("Matched %d entr%s", $match_count, $match_count == 1?"y":"ies"), MSGLEVEL_CLIENTCRAP); } else { Irssi::print("No matches", MSGLEVEL_CLIENTCRAP); } } sub cmd_help_intercept_grep { if ($_[0] =~ m/grep/i) { Irssi::print($_, MSGLEVEL_CLIENTCRAP) for (@$HELP_TEXT); Irssi::signal_stop; } } Irssi::command_bind('grep', 'cmd_grep'); Irssi::command_bind('help', 'cmd_help_intercept_grep');