vi: fix replacement of single character with CR
authorRon Yorston <rmy@pobox.com>
Sun, 3 Feb 2019 14:01:58 +0000 (14:01 +0000)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 8 Feb 2019 12:03:06 +0000 (13:03 +0100)
Currently if the 'r' command is followed by a carriage return a
literal CR replaces the current character.

Fix this so that:

- a new line is inserted
- the autoindent setting is respected
- the cursor is placed at the start of the new line

function                                             old     new   delta
do_cmd                                              5052    5060      +8
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/0 up/down: 8/0)                 Total: 8 bytes

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
editors/vi.c

index c6adeb311740ff84adefbc559a1fb6fd89f248e0..899fcf57edc6bdb5a0b98ac1c3cca2fe3c31fc5b 100644 (file)
@@ -4189,14 +4189,9 @@ static void do_cmd(int c)
        case 'r':                       // r- replace the current char with user input
                c1 = get_one_char();    // get the replacement char
                if (*dot != '\n') {
-#if ENABLE_FEATURE_VI_UNDO
-                       undo_push(dot, 1, UNDO_DEL);
-                       *dot = c1;
-                       undo_push(dot, 1, UNDO_INS_CHAIN);
-#else
-                       *dot = c1;
-                       modified_count++;
-#endif
+                       dot = text_hole_delete(dot, dot, ALLOW_UNDO);
+                       dot = char_insert(dot, c1, ALLOW_UNDO_CHAIN);
+                       dot_left();
                }
                end_cmd_q();    // stop adding to q
                break;