All pastes #373892 Raw Edit

Stuff

public text v1 · immutable
#373892 ·published 2007-02-27 02:09 UTC
rendered paste body
#! /usr/bin/perl

use strict;
use Irssi;
use Irssi::Irc;
#use Data::Dumper;

use vars qw{$VERSION %IRSSI %last};
$VERSION = "1.1";
%IRSSI = (
          name        => 'wnn',
          authors     => 'Dennis M<F8>llegaard Pedersen aka [dmp]',
          contact     => 'dennis@moellegaard.dk',
          license     => 'GPL',
          description => 'adds an additional window navigation command: /wnn <window name>',
         );

Irssi::theme_register([
        'wnn_help', '$0',
    'wnn_loaded', '%R>>%n %_Scriptinfo:%_ Loaded $0 version $1 by $2.',
        'wnn_notfound', '%R>>%n wnn: Window \'$0\' not found'
]);

%last = ( name => '', win_found => '' );

my $help = <<EOF;
Usage: /wnn <name>

  Searches all windows for a window named <name>. If one
  is found, wnn gotos that window. If multiple windows
  match repeat the command to find the next window.

Example: /wnn bz
EOF

sub cmd_wnn {
        my($data, $server, $witem) = @_;
        my($name,$new_search,$enable_search);
        my(@windows);

        if( $data =~ /^\s*(\S+)\s*$/ ) {
                $name = $1;

                # Detect if we're repeating last search
                $new_search = $name ne $last{name};

                # Detect if we're changed window someone since last search
                $new_search = $witem->{'name'} ne $last{win_found} if(not $new_search and $witem );

 $last{win_found} = '' if($new_search);

                $last{name} = $name;

                # Should we (true) search from the beginnig, or (false) wait until we see $last{win_found}
                $enable_search = $new_search;

                my @wins = sort { $a->{'refnum'} <=> $b->{'refnum'} } Irssi::windows();

                for my $win (@wins) {
                        if($new_search || $enable_search) {
                                my $act = $win->{active};

                                next if( $act->{visible_name} eq '' );  # Ignore status window

                                #if( $act->{visible_name} =~ /$name/i ) {
                                #if( $win->get_active_name() =~ /$name/i ) {
                                if( $win->get_active_name() =~  /\Q${name}/i ) {
                                        $last{win_found} = $win->get_active_name();
                                        $win->set_active();
                                        return;
                                }
                        }
                        elsif( !$enable_search ) {
                                # We're looking for $last{win_found}
                                $enable_search = ($win->get_active_name() eq $last{win_found});
                        }
                }

                $last{win_found} = '';
                Irssi::printformat(MSGLEVEL_CLIENTNOTICE, 'wnn_notfound', $name);
        }
        else {
                Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'wnn_help', $help);
        }
}

Irssi::command_bind('wnn', 'cmd_wnn');