diff options
author | Ron Yorston <rmy@pobox.com> | 2022-04-07 11:41:52 +0100 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2022-04-07 11:41:52 +0100 |
commit | b34845ed2e1583bec6581b6881cc7d6c84454276 (patch) | |
tree | f1ecff71fa8f84e44f0b8794f0d2d33031f69dc8 /editors/vi.c | |
parent | af41de68901d48753eb73491d54931a99d1a13b5 (diff) | |
parent | fc7868602ecf0d761a9a877141add4a9b6918d02 (diff) | |
download | busybox-w32-b34845ed2e1583bec6581b6881cc7d6c84454276.tar.gz busybox-w32-b34845ed2e1583bec6581b6881cc7d6c84454276.tar.bz2 busybox-w32-b34845ed2e1583bec6581b6881cc7d6c84454276.zip |
Merge branch 'busybox'
Diffstat (limited to 'editors/vi.c')
-rw-r--r-- | editors/vi.c | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/editors/vi.c b/editors/vi.c index b30369302..dd8dd488a 100644 --- a/editors/vi.c +++ b/editors/vi.c | |||
@@ -233,6 +233,11 @@ | |||
233 | 233 | ||
234 | #endif | 234 | #endif |
235 | 235 | ||
236 | #if !ENABLE_PLATFORM_MINGW32 | ||
237 | #define isbackspace(c) ((c) == term_orig.c_cc[VERASE] || (c) == 8 || (c) == 127) | ||
238 | #else | ||
239 | #define isbackspace(c) ((c) == 8 || (c) == 127) | ||
240 | #endif | ||
236 | 241 | ||
237 | enum { | 242 | enum { |
238 | MAX_TABSTOP = 32, // sanity limit | 243 | MAX_TABSTOP = 32, // sanity limit |
@@ -371,6 +376,7 @@ struct globals { | |||
371 | int last_modified_count; // = -1; | 376 | int last_modified_count; // = -1; |
372 | int cmdline_filecnt; // how many file names on cmd line | 377 | int cmdline_filecnt; // how many file names on cmd line |
373 | int cmdcnt; // repetition count | 378 | int cmdcnt; // repetition count |
379 | char *rstart; // start of text in Replace mode | ||
374 | unsigned rows, columns; // the terminal screen is this size | 380 | unsigned rows, columns; // the terminal screen is this size |
375 | #if ENABLE_FEATURE_VI_ASK_TERMINAL | 381 | #if ENABLE_FEATURE_VI_ASK_TERMINAL |
376 | int get_rowcol_error; | 382 | int get_rowcol_error; |
@@ -509,6 +515,7 @@ struct globals { | |||
509 | #define last_modified_count (G.last_modified_count) | 515 | #define last_modified_count (G.last_modified_count) |
510 | #define cmdline_filecnt (G.cmdline_filecnt ) | 516 | #define cmdline_filecnt (G.cmdline_filecnt ) |
511 | #define cmdcnt (G.cmdcnt ) | 517 | #define cmdcnt (G.cmdcnt ) |
518 | #define rstart (G.rstart ) | ||
512 | #define rows (G.rows ) | 519 | #define rows (G.rows ) |
513 | #define columns (G.columns ) | 520 | #define columns (G.columns ) |
514 | #define crow (G.crow ) | 521 | #define crow (G.crow ) |
@@ -1272,11 +1279,7 @@ static char *get_input_line(const char *prompt) | |||
1272 | c = get_one_char(); | 1279 | c = get_one_char(); |
1273 | if (c == '\n' || c == '\r' || c == 27) | 1280 | if (c == '\n' || c == '\r' || c == 27) |
1274 | break; // this is end of input | 1281 | break; // this is end of input |
1275 | #if !ENABLE_PLATFORM_MINGW32 | 1282 | if (isbackspace(c)) { |
1276 | if (c == term_orig.c_cc[VERASE] || c == 8 || c == 127) { | ||
1277 | #else | ||
1278 | if (c == 8 || c == 127) { | ||
1279 | #endif | ||
1280 | // user wants to erase prev char | 1283 | // user wants to erase prev char |
1281 | write1("\b \b"); // erase char on screen | 1284 | write1("\b \b"); // erase char on screen |
1282 | buf[--i] = '\0'; | 1285 | buf[--i] = '\0'; |
@@ -2265,12 +2268,16 @@ static char *char_insert(char *p, char c, int undo) // insert the char c at 'p' | |||
2265 | p += 1 + stupid_insert(p, ' '); | 2268 | p += 1 + stupid_insert(p, ' '); |
2266 | } | 2269 | } |
2267 | #endif | 2270 | #endif |
2268 | #if !ENABLE_PLATFORM_MINGW32 | 2271 | } else if (isbackspace(c)) { |
2269 | } else if (c == term_orig.c_cc[VERASE] || c == 8 || c == 127) { // Is this a BS | 2272 | if (cmd_mode == 2) { |
2270 | #else | 2273 | // special treatment for backspace in Replace mode |
2271 | } else if (c == 8 || c == 127) { // Is this a BS | 2274 | if (p > rstart) { |
2275 | p--; | ||
2276 | #if ENABLE_FEATURE_VI_UNDO | ||
2277 | undo_pop(); | ||
2272 | #endif | 2278 | #endif |
2273 | if (p > text) { | 2279 | } |
2280 | } else if (p > text) { | ||
2274 | p--; | 2281 | p--; |
2275 | p = text_hole_delete(p, p, ALLOW_UNDO_QUEUED); // shrink buffer 1 char | 2282 | p = text_hole_delete(p, p, ALLOW_UNDO_QUEUED); // shrink buffer 1 char |
2276 | } | 2283 | } |
@@ -3863,9 +3870,9 @@ static void do_cmd(int c) | |||
3863 | undo_queue_commit(); | 3870 | undo_queue_commit(); |
3864 | } else { | 3871 | } else { |
3865 | if (1 <= c || Isprint(c)) { | 3872 | if (1 <= c || Isprint(c)) { |
3866 | if (c != 27) | 3873 | if (c != 27 && !isbackspace(c)) |
3867 | dot = yank_delete(dot, dot, PARTIAL, YANKDEL, ALLOW_UNDO); // delete char | 3874 | dot = yank_delete(dot, dot, PARTIAL, YANKDEL, ALLOW_UNDO); |
3868 | dot = char_insert(dot, c, ALLOW_UNDO_CHAIN); // insert new char | 3875 | dot = char_insert(dot, c, ALLOW_UNDO_CHAIN); |
3869 | } | 3876 | } |
3870 | goto dc1; | 3877 | goto dc1; |
3871 | } | 3878 | } |
@@ -4424,6 +4431,7 @@ static void do_cmd(int c) | |||
4424 | dc5: | 4431 | dc5: |
4425 | cmd_mode = 2; | 4432 | cmd_mode = 2; |
4426 | undo_queue_commit(); | 4433 | undo_queue_commit(); |
4434 | rstart = dot; | ||
4427 | break; | 4435 | break; |
4428 | case KEYCODE_DELETE: | 4436 | case KEYCODE_DELETE: |
4429 | if (dot < end - 1) | 4437 | if (dot < end - 1) |