Make the put commands 'p' and 'P' behave more like vi:

- allow a repetition count to be specified;

- when the text being inserted doesn't include a newline the cursor
  should be positioned at the end of the inserted text.

function                                             old     new   delta
do_cmd                                              4765    4842     +77
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/0 up/down: 77/0)               Total: 77 bytes

Signed-off-by: Ron Yorston <r...@pobox.com>
---
 editors/vi.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/editors/vi.c b/editors/vi.c
index e63b7ca7f..3ae961feb 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -3413,11 +3413,12 @@ static void do_cmd(int c)
                        break;
                }
                // are we putting whole lines or strings
+               cnt = 0;
                if (regtype[YDreg] == WHOLE) {
                        if (c == 'P') {
                                dot_begin();    // putting lines- Put above
                        }
-                       if (c == 'p') {
+                       else /* if ( c == 'p') */ {
                                // are we putting after very last line?
                                if (end_line(dot) == (end - 1)) {
                                        dot = end;      // force dot to end of 
text[]
@@ -3428,8 +3429,16 @@ static void do_cmd(int c)
                } else {
                        if (c == 'p')
                                dot_right();    // move to right, can move to NL
+                       // how far to move cursor if register doesn't have a NL
+                       if (strchr(p, '\n') == NULL)
+                               cnt = (cmdcnt ?: 1) * strlen(p) - 1;
                }
-               string_insert(dot, p, ALLOW_UNDO);      // insert the string
+               do {
+                       // dot is adjusted if text[] is reallocated so we don't 
have to
+                       string_insert(dot, p, allow_undo);      // insert the 
string
+                       allow_undo = ALLOW_UNDO_CHAIN;
+               } while (--cmdcnt > 0);
+               dot += cnt;
                end_cmd_q();    // stop adding to q
                break;
        case 'U':                       // U- Undo; replace current line with 
original version
-- 
2.30.2

_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to