[PATCH] vi: fix replacement of single character with CR

Ron Yorston rmy at pobox.com
Sun Feb 3 14:01:58 UTC 2019


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 at pobox.com>
---
 editors/vi.c | 11 +++--------
 1 file changed, 3 insertions(+), 8 deletions(-)

diff --git a/editors/vi.c b/editors/vi.c
index c6adeb311..899fcf57e 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -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;
-- 
2.20.1



More information about the busybox mailing list