aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--vim-mode/vim_mode.pl96
1 files changed, 51 insertions, 45 deletions
diff --git a/vim-mode/vim_mode.pl b/vim-mode/vim_mode.pl
index e5cf904..56982bb 100644
--- a/vim-mode/vim_mode.pl
+++ b/vim-mode/vim_mode.pl
@@ -726,51 +726,10 @@ sub cmd_ex_command {
Irssi::command('window last');
# Go to best regex matching window.
} else {
- my $server;
-
- if ($buffer =~ m{^(.+)/(.+)}) {
- $server = $1;
- $buffer = $2;
- }
-
- print ":b searching for channel $buffer" if DEBUG;
- print ":b on server $server" if $server and DEBUG;
-
- my @matches;
- foreach my $window (Irssi::windows()) {
- # Matching window names.
- if ($window->{name} =~ /$buffer/i) {
- my $ratio = ($+[0] - $-[0]) / length($window->{name});
- push @matches, { window => $window,
- item => undef,
- ratio => $ratio };
- print ":b $window->{name}: $ratio" if DEBUG;
- }
- # Matching Window item names (= channels).
- foreach my $item ($window->items()) {
- # Wrong server.
- if ($server and (!$item->{server} or
- $item->{server}->{chatnet} !~ /^$server/i)) {
- next;
- }
- if ($item->{name} =~ /$buffer/i) {
- my $length = length($item->{name});
- $length-- if index($item->{name}, '#') == 0;
- my $ratio = ($+[0] - $-[0]) / $length;
- push @matches, { window => $window,
- item => $item,
- ratio => $ratio };
- print ":b $window->{name} $item->{name}: $ratio"
- if DEBUG;
- }
- }
- }
-
- if (scalar @matches > 0) {
- @matches = sort {$b->{ratio} <=> $a->{ratio}} @matches;
-
- $window = $matches[0]->{window};
- $item = $matches[0]->{item};
+ my $matches = _matching_windows($buffer);
+ if (scalar @$matches > 0) {
+ $window = @$matches[0]->{window};
+ $item = @$matches[0]->{item};
}
}
@@ -783,6 +742,53 @@ sub cmd_ex_command {
}
}
+sub _matching_windows {
+ my ($buffer) = @_;
+
+ my $server;
+
+ if ($buffer =~ m{^(.+)/(.+)}) {
+ $server = $1;
+ $buffer = $2;
+ }
+
+ print ":b searching for channel $buffer" if DEBUG;
+ print ":b on server $server" if $server and DEBUG;
+
+ my @matches;
+ foreach my $window (Irssi::windows()) {
+ # Matching window names.
+ if ($window->{name} =~ /$buffer/i) {
+ my $ratio = ($+[0] - $-[0]) / length($window->{name});
+ push @matches, { window => $window,
+ item => undef,
+ ratio => $ratio };
+ print ":b $window->{name}: $ratio" if DEBUG;
+ }
+ # Matching Window item names (= channels).
+ foreach my $item ($window->items()) {
+ # Wrong server.
+ if ($server and (!$item->{server} or
+ $item->{server}->{chatnet} !~ /^$server/i)) {
+ next;
+ }
+ if ($item->{name} =~ /$buffer/i) {
+ my $length = length($item->{name});
+ $length-- if index($item->{name}, '#') == 0;
+ my $ratio = ($+[0] - $-[0]) / $length;
+ push @matches, { window => $window,
+ item => $item,
+ ratio => $ratio };
+ print ":b $window->{name} $item->{name}: $ratio" if DEBUG;
+ }
+ }
+ }
+
+ @matches = sort {$b->{ratio} <=> $a->{ratio}} @matches;
+
+ return \@matches;
+}
+
# vi mode status item.
sub vim_mode_cb {