aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--vim-mode/vim_mode.pl41
1 files changed, 32 insertions, 9 deletions
diff --git a/vim-mode/vim_mode.pl b/vim-mode/vim_mode.pl
index 7c5f957..7787634 100644
--- a/vim-mode/vim_mode.pl
+++ b/vim-mode/vim_mode.pl
@@ -906,6 +906,7 @@ my $should_ignore = 0;
# ex mode buffer
my @ex_buf;
+my $ex_cursor;
# ex mode history storage.
my @ex_history;
@@ -2381,8 +2382,8 @@ sub _parse_mapping {
my ($string) = @_;
$string =~ s/<([^>]+)>/_parse_mapping_bracket($1)/ge;
- _warn("Parse mapping: $string");
if (index($string, '<invalid>') != -1) {
+ _warn("Parse mapping failed: $string");
return undef;
}
return $string;
@@ -2607,9 +2608,11 @@ sub vim_mode_cmd {
if ($mode == M_INS) {
$mode_str = 'Insert';
} elsif ($mode == M_EX) {
- $mode_str = '%_Ex%_';
+ #$mode_str = '%_Ex%_';
+ $mode_str = 'Ex';
} else {
- $mode_str = '%_Command%_';
+ #$mode_str = '%_Command%_';
+ $mode_str = 'Command';
if ($register ne '"' or $numeric_prefix or $operator or $movement or
$pending_map) {
my $partial = '';
@@ -2810,10 +2813,12 @@ sub handle_input_buffer {
ex_history_back();
} elsif ($arrow eq 'B') { # down
ex_history_fwd();
+ } elsif ($arrow eq 'C') { # right
+ ex_move_right();
+ } elsif ($arrow eq 'D') { # left
+ ex_move_left();
} else {
- $arrow =~ s/C/right/;
- $arrow =~ s/D/left/;
- _debug("Arrow key $arrow not supported");
+ _debug("somethign really weird happened: \"$key_str\"");
}
}
} else {
@@ -3157,11 +3162,14 @@ sub handle_command_ex {
# BS key (8) or DEL key (127) - remove last character.
if ($key == 8 || $key == 127) {
print "Delete" if DEBUG;
- if (@ex_buf > 0) {
- pop @ex_buf;
+ if (@ex_buf > 0 && $ex_cursor > 0) {
+ # pop @ex_buf;
+ # $ex_cursor--;
+ splice @ex_buf, $ex_cursor--, 1, ('');
_set_prompt(':' . join '', @ex_buf);
# Backspacing over : exits ex-mode.
} else {
+ $ex_cursor = 0;
_update_mode(M_CMD);
}
@@ -3188,7 +3196,7 @@ sub handle_command_ex {
} else {
if ($key != -1) {
# check we're not called from an ex_history_* function
- push @ex_buf, chr $key;
+ splice @ex_buf, $ex_cursor++, 1, (chr $key);
}
_set_prompt(':' . join '', @ex_buf);
}
@@ -3563,6 +3571,7 @@ sub _update_mode {
# Also clear ex-mode buffer.
@ex_buf = ();
+ $ex_cursor = 0;
}
Irssi::statusbar_items_redraw("vim_mode");
@@ -3715,6 +3724,7 @@ sub ex_history_fwd {
_debug("Ex history line: $line");
@ex_buf = split '', $line;
+ $ex_cursor = scalar @ex_buf;
handle_command_ex(-1);
}
@@ -3732,10 +3742,23 @@ sub ex_history_back {
_debug("Ex history line: $line");
@ex_buf = split '', $line;
+ $ex_cursor = scalar @ex_buf;
handle_command_ex(-1);
}
+
+# move the ex buffer cursor.
+sub ex_move_left {
+ $ex_cursor--;
+ _debug("E_M_L: Moving ex cursor to $ex_cursor");
+}
+
+sub ex_move_right {
+ $ex_cursor++;
+ _debug("E_M_R: Moving ex cursor to $ex_cursor");
+}
+
sub ex_history_show {
my $win = Irssi::active_win();
$win->print("Ex command history:");