[PATCH v3 0/1] MR8467: conhost: Implement F1 and F3 support for history retrieval.
F1 and F3 allow partial retrieval of previous entry from console history. They are used as shortcuts such that if the following were entered at the command line: ``` md tmptmp cd <F3> ``` F3 will retrieve the previous line from history past the cursor position, and be auto-completed to "cd tmptmp". F1 works in a similar fashion, but with one character at a time. -- v3: conhost: Implement F1 and F3 support for history retrieval. https://gitlab.winehq.org/wine/wine/-/merge_requests/8467
From: Joe Souza <jsouza(a)yahoo.com> --- programs/conhost/conhost.c | 55 +++++++++++++++++++++++++++++++------- 1 file changed, 46 insertions(+), 9 deletions(-) diff --git a/programs/conhost/conhost.c b/programs/conhost/conhost.c index 89c030e86c8..3153c4d162c 100644 --- a/programs/conhost/conhost.c +++ b/programs/conhost/conhost.c @@ -774,6 +774,41 @@ static void edit_line_find_in_history( struct console *console ) while (ctx->history_index != start_pos); } +static void edit_line_copy_from_hist( struct console *console, int copycount ) +{ + if (console->edit_line.history_index) + { + unsigned int index = console->edit_line.history_index - 1; + struct edit_line *ctx = &console->edit_line; + WCHAR *line = edit_line_history(console, index); + unsigned int len = line ? lstrlenW(line) : 0; + + if (len > ctx->cursor) + { + unsigned int ccount = (copycount > 0) ? copycount : len - ctx->cursor; + + /* Clean the screen. */ + edit_line_delete(console, ctx->cursor, ctx->len); + /* Insert new string. */ + if (edit_line_grow(console, len + 1)) + { + edit_line_insert( console, &line[ctx->cursor], ccount ); + } + } + free(line); + } +} + +static void edit_line_copy_one_from_hist( struct console *console ) +{ + edit_line_copy_from_hist(console, 1); +} + +static void edit_line_copy_all_from_hist( struct console *console ) +{ + edit_line_copy_from_hist(console, -1); +} + static void edit_line_move_left( struct console *console ) { if (console->edit_line.cursor > 0) console->edit_line.cursor--; @@ -1137,15 +1172,17 @@ static const struct edit_line_key_map emacs_key_map[] = static const struct edit_line_key_entry win32_std_key_map[] = { - { VK_LEFT, edit_line_move_left }, - { VK_RIGHT, edit_line_move_right }, - { VK_HOME, edit_line_move_home }, - { VK_END, edit_line_move_end }, - { VK_UP, edit_line_move_to_prev_hist }, - { VK_DOWN, edit_line_move_to_next_hist }, - { VK_INSERT, edit_line_toggle_insert }, - { VK_F8, edit_line_find_in_history }, - { VK_ESCAPE, edit_line_clear }, + { VK_LEFT, edit_line_move_left }, + { VK_RIGHT, edit_line_move_right }, + { VK_HOME, edit_line_move_home }, + { VK_END, edit_line_move_end }, + { VK_UP, edit_line_move_to_prev_hist }, + { VK_DOWN, edit_line_move_to_next_hist }, + { VK_INSERT, edit_line_toggle_insert }, + { VK_F8, edit_line_find_in_history }, + { VK_ESCAPE, edit_line_clear }, + { VK_F1, edit_line_copy_one_from_hist }, + { VK_F3, edit_line_copy_all_from_hist }, { 0 } }; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/8467
Changes pushed. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/8467#note_108631
participants (2)
-
Joe Souza -
Joe Souza (@JoeS209)