[prev in list] [next in list] [prev in thread] [next in thread]
List: busybox
Subject: Re: [PATCH] vi: improved handling of backspace in replace mode
From: Denys Vlasenko <vda.linux () googlemail ! com>
Date: 2022-03-04 21:58:45
Message-ID: CAK1hOcOXM1ca8Am4njJMd6VSe70jWN_VDTOEVw0RPx6WrXfPOw () mail ! gmail ! com
[Download RAW message or body]
Applied, thank you
On Thu, Mar 3, 2022 at 12:41 PM Ron Yorston <rmy@pobox.com> 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 <rmy@pobox.com>
> ---
> 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
> busybox@busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic