aboutsummaryrefslogtreecommitdiffstats
path: root/vim-mode/vim_mode.pl
diff options
context:
space:
mode:
authorSimon Ruderich <simon@ruderich.org>2010-09-28 21:59:50 +0000
committerSimon Ruderich <simon@ruderich.org>2010-09-28 22:00:35 +0000
commite77c897c5a01a14a6f0f1cf24a6924fb61b50994 (patch)
tree1055f985000d3f9386a9454e1ed13934ad740624 /vim-mode/vim_mode.pl
parentchanged licence to MIT (diff)
downloadirssi-scripts-e77c897c5a01a14a6f0f1cf24a6924fb61b50994.tar.gz
irssi-scripts-e77c897c5a01a14a6f0f1cf24a6924fb61b50994.zip
vim_mode: Move cmd and ex-mode handling to separate functions.
Diffstat (limited to 'vim-mode/vim_mode.pl')
-rw-r--r--vim-mode/vim_mode.pl306
1 files changed, 155 insertions, 151 deletions
diff --git a/vim-mode/vim_mode.pl b/vim-mode/vim_mode.pl
index 74ccd18..3ba679d 100644
--- a/vim-mode/vim_mode.pl
+++ b/vim-mode/vim_mode.pl
@@ -918,8 +918,10 @@ sub got_key {
return;
}
- if ($mode == M_CMD || $mode == M_EX) {
- handle_command($key);
+ if ($mode == M_CMD) {
+ handle_command_cmd($key);
+ } elsif ($mode == M_EX) {
+ handle_command_ex($key);
}
}
@@ -982,184 +984,186 @@ sub handle_numeric_prefix {
}
}
-sub handle_command {
+sub handle_command_cmd {
my ($key) = @_;
my $should_stop = 1;
- if ($mode == M_EX) {
- # DEL key - remove last character
- if ($key == 127) {
- print "Delete" if DEBUG;
- pop @ex_buf;
- _set_prompt(':' . join '', @ex_buf);
-
- # Return key - execute command
- } elsif ($key == 10) {
- print "Run ex-mode command" if DEBUG;
- cmd_ex_command();
- _set_prompt('');
- @ex_buf = ();
- _update_mode(M_CMD);
-
- # Append entered key
- } else {
- push @ex_buf, chr $key;
- _set_prompt(':' . join '', @ex_buf);
- }
-
- Irssi::statusbar_items_redraw("vim_windows");
+ my $char = chr($key);
- } else {
- my $char = chr($key);
+ # We need to treat $movements_multiple specially as they need another
+ # argument.
+ if ($movement) {
+ $movement .= $char;
+ }
- # We need to treat $movements_multiple specially as they need another
- # argument.
- if ($movement) {
- $movement .= $char;
- }
+ # S is an alias for cc.
+ if (!$movement and !$operator and $char eq 'S') {
+ print "Changing S to cc" if DEBUG;
+ $char = 'c';
+ $operator = 'c';
+ }
- # S is an alias for cc.
- if (!$movement and !$operator and $char eq 'S') {
- print "Changing S to cc" if DEBUG;
- $char = 'c';
- $operator = 'c';
+ if (!$movement && ($char =~ m/[1-9]/ ||
+ ($numeric_prefix && $char =~ m/[0-9]/))) {
+ print "Processing numeric prefix: $char" if DEBUG;
+ handle_numeric_prefix($char);
+
+ } elsif (!$movement && exists $movements_multiple->{$char}) {
+ print "Processing movement: $char" if DEBUG;
+ $movement = $char;
+
+ } elsif (!$movement && exists $operators->{$char}) {
+ print "Processing operator: $char" if DEBUG;
+
+ # Abort operator if we already have one pending.
+ if ($operator) {
+ # But allow cc/dd/yy.
+ if ($operator eq $char) {
+ print "Processing operator: ", $operator, $char if DEBUG;
+ my $pos = _input_pos();
+ $operators->{$operator}->{func}->(0, _input_len(), '');
+ # Restore position for yy.
+ if ($char eq 'y') {
+ _input_pos($pos);
+ }
+ }
+ $numeric_prefix = undef;
+ $operator = undef;
+ $movement = undef;
+ # Set new operator.
+ } else {
+ $operator = $char;
}
- if (!$movement && ($char =~ m/[1-9]/ ||
- ($numeric_prefix && $char =~ m/[0-9]/))) {
- print "Processing numeric prefix: $char" if DEBUG;
- handle_numeric_prefix($char);
-
- } elsif (!$movement && exists $movements_multiple->{$char}) {
- print "Processing movement: $char" if DEBUG;
- $movement = $char;
+ } elsif ($movement || exists $movements->{$char}) {
+ print "Processing movement command: $char" if DEBUG;
- } elsif (!$movement && exists $operators->{$char}) {
- print "Processing operator: $char" if DEBUG;
+ my $skip = 0;
- # Abort operator if we already have one pending.
- if ($operator) {
- # But allow cc/dd/yy.
- if ($operator eq $char) {
- print "Processing operator: ", $operator, $char if DEBUG;
- my $pos = _input_pos();
- $operators->{$operator}->{func}->(0, _input_len(), '');
- # Restore position for yy.
- if ($char eq 'y') {
- _input_pos($pos);
- }
+ if (!$movement) {
+ # . repeats the last command.
+ if ($char eq '.' and defined $last->{char}) {
+ $char = $last->{char};
+ # If . is given a count then it replaces original count.
+ if (not defined $numeric_prefix) {
+ $numeric_prefix = $last->{numeric_prefix};
}
- $numeric_prefix = undef;
- $operator = undef;
- $movement = undef;
- # Set new operator.
- } else {
- $operator = $char;
+ $operator = $last->{operator};
+ $movement = $last->{movement};
+ $register = $last->{register};
+ } elsif ($char eq '.') {
+ $skip = 1;
}
+ # C and D force the matching operator
+ if ($char eq 'C') {
+ $operator = 'c';
+ } elsif ($char eq 'D') {
+ $operator = 'd';
+ }
+ }
- } elsif ($movement || exists $movements->{$char}) {
- print "Processing movement command: $char" if DEBUG;
-
- my $skip = 0;
-
- if (!$movement) {
- # . repeats the last command.
- if ($char eq '.' and defined $last->{char}) {
- $char = $last->{char};
- # If . is given a count then it replaces original count.
- if (not defined $numeric_prefix) {
- $numeric_prefix = $last->{numeric_prefix};
- }
- $operator = $last->{operator};
- $movement = $last->{movement};
- $register = $last->{register};
- } elsif ($char eq '.') {
- $skip = 1;
- }
- # C and D force the matching operator
- if ($char eq 'C') {
- $operator = 'c';
- } elsif ($char eq 'D') {
- $operator = 'd';
- }
+ if ($skip) {
+ print "Skipping movement and operator." if DEBUG;
+ } else {
+ # Make sure count is at least 1.
+ if (not $numeric_prefix) {
+ $numeric_prefix = 1;
}
- if ($skip) {
- print "Skipping movement and operator." if DEBUG;
+ # Execute the movement (multiple times).
+ my $cur_pos = _input_pos();
+ if (not $movement) {
+ $movements->{$char}->{func}->($numeric_prefix, $cur_pos);
} else {
- # Make sure count is at least 1.
- if (not $numeric_prefix) {
- $numeric_prefix = 1;
- }
-
- # Execute the movement (multiple times).
- my $cur_pos = _input_pos();
- if (not $movement) {
- $movements->{$char}->{func}->($numeric_prefix, $cur_pos);
- } else {
- # Use the real movement command (like t or f) for operator
- # below.
- $char = substr $movement, 0, 1;
- $movements->{$char}->{func}
- ->($numeric_prefix, $cur_pos, substr $movement, 1);
- }
- my $new_pos = _input_pos();
-
- # If we have an operator pending then run it on the handled
- # text. But only if the movement changed the position (this
- # prevents problems with e.g. f when the search string doesn't
- # exist).
- if ($operator and $cur_pos != $new_pos) {
- print "Processing operator: ", $operator if DEBUG;
- $operators->{$operator}->{func}->($cur_pos, $new_pos, $char);
- }
-
- # Store command, necessary for . But ignore movements and
- # registers.
- if ($operator or $char eq 'x' or $char eq 'X' or $char eq 'r'
- or $char eq 'p' or $char eq 'P' or
- $char eq 'C' or $char eq 'D' or
- $char eq '~' or $char eq '"') {
- $last->{char} = $char;
- $last->{numeric_prefix} = $numeric_prefix;
- $last->{operator} = $operator;
- $last->{movement} = $movement;
- $last->{register} = $register;
- }
+ # Use the real movement command (like t or f) for operator
+ # below.
+ $char = substr $movement, 0, 1;
+ $movements->{$char}->{func}
+ ->($numeric_prefix, $cur_pos, substr $movement, 1);
}
-
- $numeric_prefix = undef;
- $operator = undef;
- $movement = undef;
-
- if ($char ne '"' and $register ne '"') {
- print 'Changing register to "' if DEBUG;
- $register = '"';
+ my $new_pos = _input_pos();
+
+ # If we have an operator pending then run it on the handled text.
+ # But only if the movement changed the position (this prevents
+ # problems with e.g. f when the search string doesn't exist).
+ if ($operator and $cur_pos != $new_pos) {
+ print "Processing operator: ", $operator if DEBUG;
+ $operators->{$operator}->{func}->($cur_pos, $new_pos, $char);
}
- # Start Ex mode.
- } elsif ($char eq ':') {
- if (not script_is_loaded('prompt_info')) {
- _warn("Warning: Ex mode requires the 'prompt_info' script. " .
- "Please load it and try again.");
- } else {
- _update_mode(M_EX);
- _set_prompt(':');
+ # Store command, necessary for . But ignore movements and
+ # registers.
+ if ($operator or $char eq 'x' or $char eq 'X' or $char eq 'r' or
+ $char eq 'p' or $char eq 'P' or $char eq 'C' or
+ $char eq 'D' or $char eq '~' or $char eq '"') {
+ $last->{char} = $char;
+ $last->{numeric_prefix} = $numeric_prefix;
+ $last->{operator} = $operator;
+ $last->{movement} = $movement;
+ $last->{register} = $register;
}
+ }
- # Enter key sends the current input line in command mode as well.
- } elsif ($key == 10) {
- $should_stop = 0;
- _commit_line();
+ $numeric_prefix = undef;
+ $operator = undef;
+ $movement = undef;
+
+ if ($char ne '"' and $register ne '"') {
+ print 'Changing register to "' if DEBUG;
+ $register = '"';
}
- Irssi::statusbar_items_redraw("vim_mode");
+ # Start Ex mode.
+ } elsif ($char eq ':') {
+ if (not script_is_loaded('prompt_info')) {
+ _warn("Warning: Ex mode requires the 'prompt_info' script. " .
+ "Please load it and try again.");
+ } else {
+ _update_mode(M_EX);
+ _set_prompt(':');
+ }
+
+ # Enter key sends the current input line in command mode as well.
+ } elsif ($key == 10) {
+ $should_stop = 0;
+ _commit_line();
}
+ Irssi::statusbar_items_redraw("vim_mode");
+
_stop() if $should_stop;
}
+sub handle_command_ex {
+ my ($key) = @_;
+
+ # DEL key - remove last character
+ if ($key == 127) {
+ print "Delete" if DEBUG;
+ pop @ex_buf;
+ _set_prompt(':' . join '', @ex_buf);
+
+ # Return key - execute command
+ } elsif ($key == 10) {
+ print "Run ex-mode command" if DEBUG;
+ cmd_ex_command();
+ _set_prompt('');
+ @ex_buf = ();
+ _update_mode(M_CMD);
+
+ # Append entered key
+ } else {
+ push @ex_buf, chr $key;
+ _set_prompt(':' . join '', @ex_buf);
+ }
+
+ Irssi::statusbar_items_redraw("vim_windows");
+
+ _stop();
+}
+
+
sub vim_mode_init {
Irssi::signal_add_first 'gui key pressed' => \&got_key;
Irssi::signal_add 'setup changed' => \&setup_changed;