aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Ron Yorston <rmy@pobox.com>2019-02-03 14:01:58 +0000
committerGravatar Denys Vlasenko <vda.linux@googlemail.com>2019-02-08 13:03:06 +0100
commitdf4e3af9f716e0483bd02fd4ab3ad973ffe5b998 (patch)
tree1feec53a2fd3c7f49134322f4538daac935e1f87
parentbb983f30e7ea69604212793f228270f21e8a5b06 (diff)
downloadbusybox-df4e3af9f716e0483bd02fd4ab3ad973ffe5b998.tar.gz
busybox-df4e3af9f716e0483bd02fd4ab3ad973ffe5b998.tar.bz2
vi: fix replacement of single character with CR
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>
-rw-r--r--editors/vi.c11
1 files 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;