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.
From: Joe Souza jsouza@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 } };