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');