Applied, thank you
On Thu, Mar 3, 2022 at 12:41 PM Ron Yorston <[email protected]> wrote: > > In replace mode ('R' command) the backspace character should get > special treatment: > > - backspace only goes back to the start of the replacement; > - backspacing over replaced characters restores the original text. > > Prior to this commit BusyBox vi deleted the characters both before > and after the cursor in replace mode. > > function old new delta > undo_pop - 235 +235 > char_insert 858 884 +26 > indicate_error 81 84 +3 > find_range 654 657 +3 > static.text_yank 77 79 +2 > do_cmd 4486 4243 -243 > ------------------------------------------------------------------------------ > (add/remove: 1/0 grow/shrink: 4/1 up/down: 269/-243) Total: 26 bytes > > Signed-off-by: Ron Yorston <[email protected]> > --- > editors/vi.c | 24 ++++++++++++++++++------ > 1 file changed, 18 insertions(+), 6 deletions(-) > > diff --git a/editors/vi.c b/editors/vi.c > index d37cd48a3..4257c0fdc 100644 > --- a/editors/vi.c > +++ b/editors/vi.c > @@ -224,6 +224,7 @@ > > #endif > > +#define isbackspace(c) ((c) == term_orig.c_cc[VERASE] || (c) == 8 || (c) == > 127) > > enum { > MAX_TABSTOP = 32, // sanity limit > @@ -342,6 +343,7 @@ struct globals { > int last_modified_count; // = -1; > int cmdline_filecnt; // how many file names on cmd line > int cmdcnt; // repetition count > + char *rstart; // start of text in Replace mode > unsigned rows, columns; // the terminal screen is this size > #if ENABLE_FEATURE_VI_ASK_TERMINAL > int get_rowcol_error; > @@ -474,6 +476,7 @@ struct globals { > #define last_modified_count (G.last_modified_count) > #define cmdline_filecnt (G.cmdline_filecnt ) > #define cmdcnt (G.cmdcnt ) > +#define rstart (G.rstart ) > #define rows (G.rows ) > #define columns (G.columns ) > #define crow (G.crow ) > @@ -1212,7 +1215,7 @@ static char *get_input_line(const char *prompt) > c = get_one_char(); > if (c == '\n' || c == '\r' || c == 27) > break; // this is end of input > - if (c == term_orig.c_cc[VERASE] || c == 8 || c == 127) { > + if (isbackspace(c)) { > // user wants to erase prev char > write1("\b \b"); // erase char on screen > buf[--i] = '\0'; > @@ -2174,8 +2177,16 @@ static char *char_insert(char *p, char c, int undo) // > insert the char c at 'p' > p += 1 + stupid_insert(p, ' '); > } > #endif > - } else if (c == term_orig.c_cc[VERASE] || c == 8 || c == 127) { // Is > this a BS > - if (p > text) { > + } else if (isbackspace(c)) { > + if (cmd_mode == 2) { > + // special treatment for backspace in Replace mode > + if (p > rstart) { > + p--; > +#if ENABLE_FEATURE_VI_UNDO > + undo_pop(); > +#endif > + } > + } else if (p > text) { > p--; > p = text_hole_delete(p, p, ALLOW_UNDO_QUEUED); // > shrink buffer 1 char > } > @@ -3703,9 +3714,9 @@ static void do_cmd(int c) > undo_queue_commit(); > } else { > if (1 <= c || Isprint(c)) { > - if (c != 27) > - dot = yank_delete(dot, dot, PARTIAL, > YANKDEL, ALLOW_UNDO); // delete char > - dot = char_insert(dot, c, ALLOW_UNDO_CHAIN); > // insert new char > + if (c != 27 && !isbackspace(c)) > + dot = yank_delete(dot, dot, PARTIAL, > YANKDEL, ALLOW_UNDO); > + dot = char_insert(dot, c, ALLOW_UNDO_CHAIN); > } > goto dc1; > } > @@ -4264,6 +4275,7 @@ static void do_cmd(int c) > dc5: > cmd_mode = 2; > undo_queue_commit(); > + rstart = dot; > break; > case KEYCODE_DELETE: > if (dot < end - 1) > -- > 2.35.1 > > _______________________________________________ > busybox mailing list > [email protected] > http://lists.busybox.net/mailman/listinfo/busybox _______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
