aboutsummaryrefslogtreecommitdiff
path: root/editors
diff options
context:
space:
mode:
Diffstat (limited to 'editors')
-rw-r--r--editors/Config.in12
-rw-r--r--editors/vi.c23
2 files changed, 34 insertions, 1 deletions
diff --git a/editors/Config.in b/editors/Config.in
index e4fdd0f38..5f9566f0a 100644
--- a/editors/Config.in
+++ b/editors/Config.in
@@ -168,6 +168,18 @@ config FEATURE_VI_WIN_RESIZE
168 help 168 help
169 Make busybox vi behave nicely with terminals that get resized. 169 Make busybox vi behave nicely with terminals that get resized.
170 170
171config FEATURE_VI_ASK_TERMINAL
172 bool "Use 'tell me cursor position' ESC sequence to measure window"
173 default n
174 depends on VI
175 help
176 If terminal size can't be retrieved and $LINES/$COLUMNS are not set,
177 this option makes vi perform a last-ditch effort to find it:
178 vi positions cursor to 999,999 and asks terminal to report real
179 cursor position using "ESC [ 6 n" escape sequence, then reads stdin.
180
181 This is not clean but helps a lot on serial lines and such.
182
171config FEATURE_VI_OPTIMIZE_CURSOR 183config FEATURE_VI_OPTIMIZE_CURSOR
172 bool "Optimize cursor movement" 184 bool "Optimize cursor movement"
173 default y 185 default y
diff --git a/editors/vi.c b/editors/vi.c
index f925984ba..d3a35e781 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -138,6 +138,9 @@ struct globals {
138 int save_argc; // how many file names on cmd line 138 int save_argc; // how many file names on cmd line
139 int cmdcnt; // repetition count 139 int cmdcnt; // repetition count
140 unsigned rows, columns; // the terminal screen is this size 140 unsigned rows, columns; // the terminal screen is this size
141#if ENABLE_FEATURE_VI_ASK_TERMINAL
142 int get_rowcol_error;
143#endif
141 int crow, ccol; // cursor is on Crow x Ccol 144 int crow, ccol; // cursor is on Crow x Ccol
142 int offset; // chars scrolled off the screen to the left 145 int offset; // chars scrolled off the screen to the left
143 int have_status_msg; // is default edit status needed? 146 int have_status_msg; // is default edit status needed?
@@ -503,7 +506,11 @@ static int init_text_buffer(char *fn)
503#if ENABLE_FEATURE_VI_WIN_RESIZE 506#if ENABLE_FEATURE_VI_WIN_RESIZE
504static void query_screen_dimensions(void) 507static void query_screen_dimensions(void)
505{ 508{
506 get_terminal_width_height(STDIN_FILENO, &columns, &rows); 509# if ENABLE_FEATURE_VI_ASK_TERMINAL
510 if (!G.get_rowcol_error)
511 G.get_rowcol_error =
512# endif
513 get_terminal_width_height(STDIN_FILENO, &columns, &rows);
507 if (rows > MAX_SCR_ROWS) 514 if (rows > MAX_SCR_ROWS)
508 rows = MAX_SCR_ROWS; 515 rows = MAX_SCR_ROWS;
509 if (columns > MAX_SCR_COLS) 516 if (columns > MAX_SCR_COLS)
@@ -530,6 +537,20 @@ static void edit_file(char *fn)
530 columns = 80; 537 columns = 80;
531 size = 0; 538 size = 0;
532 query_screen_dimensions(); 539 query_screen_dimensions();
540#if ENABLE_FEATURE_VI_ASK_TERMINAL
541 if (G.get_rowcol_error /* TODO? && no input on stdin */) {
542 uint64_t k;
543 write1("\033[999;999H" "\033[6n");
544 fflush_all();
545 k = read_key(STDIN_FILENO, readbuffer, /*timeout_ms:*/ 100);
546 if ((int32_t)k == KEYCODE_CURSOR_POS) {
547 uint32_t rc = (k >> 32);
548 columns = (rc & 0x7fff);
549 rows = ((rc >> 16) & 0x7fff);
550 }
551 query_screen_dimensions();
552 }
553#endif
533 new_screen(rows, columns); // get memory for virtual screen 554 new_screen(rows, columns); // get memory for virtual screen
534 init_text_buffer(fn); 555 init_text_buffer(fn);
535 556