diff options
| author | Simon Ruderich <simon@ruderich.org> | 2010-10-04 14:15:38 +0000 | 
|---|---|---|
| committer | Simon Ruderich <simon@ruderich.org> | 2010-10-04 14:17:24 +0000 | 
| commit | 5ec91faccd74dbba9ba55b87e7d3cbc427e2ad98 (patch) | |
| tree | 954592498e8aff5bd5465d2661c19310c31df3af | |
| parent | vim_mode: Fix "xdd and "xyy not resetting the register. (diff) | |
| download | irssi-scripts-5ec91faccd74dbba9ba55b87e7d3cbc427e2ad98.tar.gz irssi-scripts-5ec91faccd74dbba9ba55b87e7d3cbc427e2ad98.zip | |
vim_mode: Add G, moves to count-th history line.
| -rw-r--r-- | vim-mode/vim_mode.pl | 45 | 
1 files changed, 43 insertions, 2 deletions
| diff --git a/vim-mode/vim_mode.pl b/vim-mode/vim_mode.pl index dba18dd..2a6edaa 100644 --- a/vim-mode/vim_mode.pl +++ b/vim-mode/vim_mode.pl @@ -15,7 +15,9 @@  #   /set vim_mode_cmd_seq j allows to use jj as Escape (any other character  #   can be used as well).  # * Cursor motion: h l 0 ^ $ <space> f t F T -# * History motion: j k +# * History motion: j k G +#   G without a count moves to the current input line, with a count it goes to +#   the count-th history line (1 is the oldest).  # * Cursor word motion: w b ge e W gE B E  # * Word objects (only the following work yet): aw aW  # * Yank and paste: y p P @@ -292,8 +294,10 @@ my $movements       'h' => { func => \&cmd_movement_h },       'l' => { func => \&cmd_movement_l },       ' ' => { func => \&cmd_movement_space }, +     # history movement       'j' => { func => \&cmd_movement_j },       'k' => { func => \&cmd_movement_k }, +     'G' => { func => \&cmd_movement_G },       # char movement, take an additional parameter and use $movement       'f' => { func => \&cmd_movement_f },       't' => { func => \&cmd_movement_t }, @@ -574,6 +578,42 @@ sub cmd_movement_k {      }      return (undef, undef);  } +sub cmd_movement_G { +    my ($count, $pos, $repeat) = @_; + +    if (Irssi::version < 20090117) { +        return; +    } + +    my @history = Irssi::active_win->get_history_lines(); + +    # Go to the current input line if no count was given or it's too big. +    if (not $count or $count - 1 >= scalar @history) { +        if (defined $history_input and defined $history_pos) { +            _input($history_input); +            _input_pos($history_pos); +            $history_index = undef; +        } +        return; +    } else { +        # Save input line so it doesn't get lost. +        if (not defined $history_index) { +            $history_input = _input(); +            $history_pos = _input_pos(); +        } +        $history_index = $count - 1; +    } + +    my $history = $history[$history_index]; +    # History is not in UTF-8! +    if ($utf8) { +        $history = decode_utf8($history); +    } +    _input($history); +    _input_pos(0); + +    return (undef, undef); +}  sub cmd_movement_f {      my ($count, $pos, $repeat, $char) = @_; @@ -1673,7 +1713,8 @@ sub handle_command_cmd {              # Make sure count is at least 1 except for functions which need to              # know if no count was used              if (not $numeric_prefix and $char ne "\x04"    # ctrl-d -                                    and $char ne "\x15") { # ctrl-u +                                    and $char ne "\x15"    # ctrl-u +                                    and $char ne 'G') {                  $numeric_prefix = 1;              } | 
