#! /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 Mllegaard Pedersen aka [dmp]', contact => 'dennis@moellegaard.dk', license => 'GPL', description => 'adds an additional window navigation command: /wnn ', ); 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 = < Searches all windows for a window named . 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');