aboutsummaryrefslogtreecommitdiff
path: root/editors/vi.c
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2022-04-07 11:41:52 +0100
committerRon Yorston <rmy@pobox.com>2022-04-07 11:41:52 +0100
commitb34845ed2e1583bec6581b6881cc7d6c84454276 (patch)
treef1ecff71fa8f84e44f0b8794f0d2d33031f69dc8 /editors/vi.c
parentaf41de68901d48753eb73491d54931a99d1a13b5 (diff)
parentfc7868602ecf0d761a9a877141add4a9b6918d02 (diff)
downloadbusybox-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.c34
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
237enum { 242enum {
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)