diff --git a/DOCS/man/console.rst b/DOCS/man/console.rst index d496710cfe..6fc11568fb 100644 --- a/DOCS/man/console.rst +++ b/DOCS/man/console.rst @@ -76,6 +76,9 @@ PGUP PGDN Stop navigating the command history. +Ctrl+r + Search the command history. + INSERT Toggle insert mode. diff --git a/player/lua/console.lua b/player/lua/console.lua index ea7bb91daf..a25370c896 100644 --- a/player/lua/console.lua +++ b/player/lua/console.lua @@ -89,6 +89,7 @@ local id = default_id local histories = {[id] = {}} local history = histories[id] local history_pos = 1 +local searching_history = false local log_buffers = {[id] = {}} local key_bindings = {} local global_margins = { t = 0, b = 0 } @@ -769,6 +770,16 @@ end -- Run the current command and clear the line (Enter) local function handle_enter() + if searching_history then + searching_history = false + selectable_items = nil + line = #matches > 0 and matches[selected_match].text or '' + cursor = #line + 1 + log_buffers[id] = {} + update() + return + end + if line == '' and input_caller == nil then return end @@ -878,6 +889,25 @@ local function handle_pgdown() go_history(#history + 1) end +local function search_history() + if selectable_items or #history == 0 then + return + end + + searching_history = true + selectable_items = {} + matches = {} + selected_match = 1 + first_match_to_print = 1 + + for i = 1, #history do + selectable_items[i] = history[#history + 1 - i] + matches[i] = { index = i, text = history[#history + 1 - i] } + end + + update() +end + local function page_up_or_prev_char() if selectable_items then handle_pgup() @@ -1532,6 +1562,7 @@ local function get_bindings() { 'end', go_end }, { 'pgup', handle_pgup }, { 'pgdwn', handle_pgdown }, + { 'ctrl+r', search_history }, { 'ctrl+c', clear }, { 'ctrl+d', maybe_exit }, { 'ctrl+k', del_to_eol }, @@ -1591,6 +1622,12 @@ set_active = function (active) history_pos = #history + 1 mp.enable_messages('terminal-default') end + elseif searching_history then + searching_history = false + line = '' + cursor = 1 + selectable_items = nil + log_buffers[id] = {} else repl_active = false suggestion_buffer = {}