From 52411c42ef00c586bce4f961b54efc38d2d60e52 Mon Sep 17 00:00:00 2001 From: Tom Feist Date: Tue, 26 Oct 2010 22:05:10 +0100 Subject: implement :servernext/prev and :itemnext/prev for switching between servers and window items. --- vim-mode/vim_mode.pl | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) (limited to 'vim-mode/vim_mode.pl') diff --git a/vim-mode/vim_mode.pl b/vim-mode/vim_mode.pl index d61db3d..71b30b1 100644 --- a/vim-mode/vim_mode.pl +++ b/vim-mode/vim_mode.pl @@ -470,6 +470,23 @@ my $commands_ex type => C_EX }, set => { char => ':set', func => \&ex_set, type => C_EX }, + itemnext => { char => ':itemnext', func => \&ex_item_next, + type => C_EX }, + inext => { char => ':itemnext', func => \&ex_item_next, + type => C_EX }, + itemprev => { char => ':itemprev', func => \&ex_item_prev, + type => C_EX }, + iprev => { char => ':itemprev', func => \&ex_item_prev, + type => C_EX }, + servernext => { char => ':servernext', func => \&ex_server_next, + type => C_EX }, + snext => { char => ':servernext', func => \&ex_server_next, + type => C_EX }, + serverprev => { char => ':serverprev', func => \&ex_server_prev, + type => C_EX }, + sprev => { char => ':serverprev', func => \&ex_server_prev, + type => C_EX }, + }; # MAPPINGS @@ -1501,6 +1518,7 @@ sub cmd_undo { } return (undef, undef); } + sub cmd_redo { print "Redo!" if DEBUG; @@ -1639,6 +1657,7 @@ sub ex_bdelete { } Irssi::command('window close'); } + sub ex_buffer { my ($arg_str, $count) = @_; @@ -1683,6 +1702,72 @@ sub ex_buffer { } } +sub ex_item_next { + my ($arg_str, $count) = @_; + my $win = Irssi::active_win; + $count = 1 unless defined $count; + + $win->item_next for (1..$count); +} + +sub ex_item_prev { + my ($arg_str, $count) = @_; + my $win = Irssi::active_win; + $count = 1 unless defined $count; + + $win->item_prev for (1..$count); +} + +sub ex_server_next { + my ($arg_str, $count) = @_; + + my @server_ids = map { $_->{tag} . '/' . $_->{nick} } Irssi::servers; + my $server = Irssi::active_server; + my $current_id = $server->{tag} . '/' . $server->{nick}; + my $next = 0; + my $server_count = scalar @server_ids; + for my $i (0..$server_count - 1) { + my $s_id = $server_ids[$i]; + if (defined($s_id) and ($s_id eq $current_id)) { + print "Found match at $i" if DEBUG; + $next = ($i + 1) % $server_count; + last; + } + } + + my $next_server = $server_ids[$next]; + $next_server =~ s|^([^/]+)/.*$|$1|; + + print "Changing to server: $next: $next_server" if DEBUG; + Irssi::command("window server $next_server"); +} + +sub ex_server_prev { + my ($arg_str, $count) = @_; + + my @server_ids = map { $_->{tag} . '/' . $_->{nick} } Irssi::servers; + my $server = Irssi::active_server; + my $current_id = $server->{tag} . '/' . $server->{nick}; + my $prev = 0; + my $server_count = scalar @server_ids; + + for my $i (0..$server_count - 1) { + my $s_id = $server_ids[$i]; + if (defined($s_id) and ($s_id eq $current_id)) { + print "Found match at $i" if DEBUG; + $prev = ($i - 1) % $server_count; + last; + } + } + + my $prev_server = $server_ids[$prev]; + $prev_server =~ s|^([^/]+)/.*$|$1|; + + print "Changing to server: $prev: $prev_server" if DEBUG; + Irssi::command("window server $prev_server"); + +} + sub ex_registers { my ($arg_str, $count) = @_; -- cgit v1.2.3