From 61052d1bb8fe5da745c4333a8bf7d031d636b76e Mon Sep 17 00:00:00 2001 From: Ron Yorston Date: Mon, 11 Feb 2019 08:29:15 +0000 Subject: vi: further fixes to undo after autoindent Commit bb983f30e (vi: fix faulty undo after autoinsert) has a number of problems: - The commit message refers to 'autoinsert' when it really means 'autoindent'. - The indentation of undo_push_insert() was incorrect. - Most seriously the commit only fixed the problem for cases where the indentation was exactly one character. This is because undo_push() only allows single characters to be queued for UNDO_INS_QUEUED. Lifting this restriction allows the example given in the previous commit message (with a three character indent) to work. function old new delta undo_push 406 435 +29 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 1/0 up/down: 29/0) Total: 29 bytes Signed-off-by: Ron Yorston Signed-off-by: Denys Vlasenko --- editors/vi.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) (limited to 'editors/vi.c') diff --git a/editors/vi.c b/editors/vi.c index 899fcf57e..065a1068e 100644 --- a/editors/vi.c +++ b/editors/vi.c @@ -2314,16 +2314,18 @@ static void undo_push(char *src, unsigned int length, uint8_t u_type) // Add to } break; case UNDO_INS_QUEUED: - if (length != 1) + if (length < 1) return; switch (undo_queue_state) { case UNDO_EMPTY: undo_queue_state = UNDO_INS; undo_queue_spos = src; case UNDO_INS: - undo_q++; // Don't need to save any data for insertions - if (undo_q == CONFIG_FEATURE_VI_UNDO_QUEUE_MAX) - undo_queue_commit(); + while (length--) { + undo_q++; // Don't need to save any data for insertions + if (undo_q == CONFIG_FEATURE_VI_UNDO_QUEUE_MAX) + undo_queue_commit(); + } return; case UNDO_DEL: // Switch from storing deleted text to inserted text @@ -2372,16 +2374,16 @@ static void undo_push(char *src, unsigned int length, uint8_t u_type) // Add to static void undo_push_insert(char *p, int len, int undo) { switch (undo) { - case ALLOW_UNDO: - undo_push(p, len, UNDO_INS); - break; - case ALLOW_UNDO_CHAIN: - undo_push(p, len, UNDO_INS_CHAIN); - break; + case ALLOW_UNDO: + undo_push(p, len, UNDO_INS); + break; + case ALLOW_UNDO_CHAIN: + undo_push(p, len, UNDO_INS_CHAIN); + break; # if ENABLE_FEATURE_VI_UNDO_QUEUE - case ALLOW_UNDO_QUEUED: - undo_push(p, len, UNDO_INS_QUEUED); - break; + case ALLOW_UNDO_QUEUED: + undo_push(p, len, UNDO_INS_QUEUED); + break; # endif } } -- cgit v1.2.3