summaryrefslogtreecommitdiffstats
path: root/player/lua/console.lua
diff options
context:
space:
mode:
Diffstat (limited to 'player/lua/console.lua')
-rw-r--r--player/lua/console.lua155
1 files changed, 82 insertions, 73 deletions
diff --git a/player/lua/console.lua b/player/lua/console.lua
index 581967e175..1e7fd14732 100644
--- a/player/lua/console.lua
+++ b/player/lua/console.lua
@@ -53,25 +53,6 @@ end
-- Apply user-set options
options.read_options(opts)
--- Build a list of commands, properties and options for tab-completion
-local option_info = {
- 'name', 'type', 'set-from-commandline', 'set-locally', 'default-value',
- 'min', 'max', 'choices',
-}
-local cmd_list = {}
-for i, cmd in ipairs(mp.get_property_native('command-list')) do
- cmd_list[i] = cmd.name
-end
-local prop_list = mp.get_property_native('property-list')
-for _, opt in ipairs(mp.get_property_native('options')) do
- prop_list[#prop_list + 1] = 'options/' .. opt
- prop_list[#prop_list + 1] = 'file-local-options/' .. opt
- prop_list[#prop_list + 1] = 'option-info/' .. opt
- for _, p in ipairs(option_info) do
- prop_list[#prop_list + 1] = 'option-info/' .. opt .. '/' .. p
- end
-end
-
local repl_active = false
local insert_mode = false
local pending_update = false
@@ -226,6 +207,7 @@ function set_active(active)
repl_active = false
undefine_key_bindings()
mp.enable_messages('silent:terminal-default')
+ collectgarbage()
end
update()
end
@@ -467,18 +449,39 @@ end
-- append: An extra string to be appended to the end of a successful
-- completion. It is only appended if 'list' contains exactly one
-- match.
-local completers = {
- { pattern = '^%s*()[%w_-]+()$', list = cmd_list, append = ' ' },
- { pattern = '^%s*set%s+()[%w_/-]+()$', list = prop_list, append = ' ' },
- { pattern = '^%s*set%s+"()[%w_/-]+()$', list = prop_list, append = '" ' },
- { pattern = '^%s*add%s+()[%w_/-]+()$', list = prop_list, append = ' ' },
- { pattern = '^%s*add%s+"()[%w_/-]+()$', list = prop_list, append = '" ' },
- { pattern = '^%s*cycle%s+()[%w_/-]+()$', list = prop_list, append = ' ' },
- { pattern = '^%s*cycle%s+"()[%w_/-]+()$', list = prop_list, append = '" ' },
- { pattern = '^%s*multiply%s+()[%w_/-]+()$', list = prop_list, append = ' ' },
- { pattern = '^%s*multiply%s+"()[%w_/-]+()$', list = prop_list, append = '" ' },
- { pattern = '${()[%w_/-]+()$', list = prop_list, append = '}' },
-}
+function build_completers()
+ -- Build a list of commands, properties and options for tab-completion
+ local option_info = {
+ 'name', 'type', 'set-from-commandline', 'set-locally', 'default-value',
+ 'min', 'max', 'choices',
+ }
+ local cmd_list = {}
+ for i, cmd in ipairs(mp.get_property_native('command-list')) do
+ cmd_list[i] = cmd.name
+ end
+ local prop_list = mp.get_property_native('property-list')
+ for _, opt in ipairs(mp.get_property_native('options')) do
+ prop_list[#prop_list + 1] = 'options/' .. opt
+ prop_list[#prop_list + 1] = 'file-local-options/' .. opt
+ prop_list[#prop_list + 1] = 'option-info/' .. opt
+ for _, p in ipairs(option_info) do
+ prop_list[#prop_list + 1] = 'option-info/' .. opt .. '/' .. p
+ end
+ end
+
+ return {
+ { pattern = '^%s*()[%w_-]+()$', list = cmd_list, append = ' ' },
+ { pattern = '^%s*set%s+()[%w_/-]+()$', list = prop_list, append = ' ' },
+ { pattern = '^%s*set%s+"()[%w_/-]+()$', list = prop_list, append = '" ' },
+ { pattern = '^%s*add%s+()[%w_/-]+()$', list = prop_list, append = ' ' },
+ { pattern = '^%s*add%s+"()[%w_/-]+()$', list = prop_list, append = '" ' },
+ { pattern = '^%s*cycle%s+()[%w_/-]+()$', list = prop_list, append = ' ' },
+ { pattern = '^%s*cycle%s+"()[%w_/-]+()$', list = prop_list, append = '" ' },
+ { pattern = '^%s*multiply%s+()[%w_/-]+()$', list = prop_list, append = ' ' },
+ { pattern = '^%s*multiply%s+"()[%w_/-]+()$', list = prop_list, append = '" ' },
+ { pattern = '${()[%w_/-]+()$', list = prop_list, append = '}' },
+ }
+end
-- Use 'list' to find possible tab-completions for 'part.' Returns the longest
-- common prefix of all the matching list items and a flag that indicates
@@ -513,7 +516,7 @@ function complete()
local after_cur = line:sub(cursor)
-- Try the first completer that works
- for _, completer in ipairs(completers) do
+ for _, completer in ipairs(build_completers()) do
-- Completer patterns should return the start and end of the word to be
-- completed as the first and second capture groups
local _, _, s, e = before_cur:find(completer.pattern)
@@ -650,47 +653,51 @@ end
-- List of input bindings. This is a weird mashup between common GUI text-input
-- bindings and readline bindings.
-local bindings = {
- { 'esc', function() set_active(false) end },
- { 'enter', handle_enter },
- { 'kp_enter', handle_enter },
- { 'shift+enter', function() handle_char_input('\n') end },
- { 'bs', handle_backspace },
- { 'shift+bs', handle_backspace },
- { 'del', handle_del },
- { 'shift+del', handle_del },
- { 'ins', handle_ins },
- { 'shift+ins', function() paste(false) end },
- { 'mbtn_mid', function() paste(false) end },
- { 'left', function() prev_char() end },
- { 'right', function() next_char() end },
- { 'up', function() move_history(-1) end },
- { 'wheel_up', function() move_history(-1) end },
- { 'down', function() move_history(1) end },
- { 'wheel_down', function() move_history(1) end },
- { 'wheel_left', function() end },
- { 'wheel_right', function() end },
- { 'ctrl+left', prev_word },
- { 'ctrl+right', next_word },
- { 'tab', complete },
- { 'home', go_home },
- { 'end', go_end },
- { 'pgup', handle_pgup },
- { 'pgdwn', handle_pgdown },
- { 'ctrl+c', clear },
- { 'ctrl+d', maybe_exit },
- { 'ctrl+k', del_to_eol },
- { 'ctrl+l', clear_log_buffer },
- { 'ctrl+u', del_to_start },
- { 'ctrl+v', function() paste(true) end },
- { 'meta+v', function() paste(true) end },
- { 'ctrl+w', del_word },
- { 'kp_dec', function() handle_char_input('.') end },
-}
+function get_bindings()
+ local bindings = {
+ { 'esc', function() set_active(false) end },
+ { 'enter', handle_enter },
+ { 'kp_enter', handle_enter },
+ { 'shift+enter', function() handle_char_input('\n') end },
+ { 'bs', handle_backspace },
+ { 'shift+bs', handle_backspace },
+ { 'del', handle_del },
+ { 'shift+del', handle_del },
+ { 'ins', handle_ins },
+ { 'shift+ins', function() paste(false) end },
+ { 'mbtn_mid', function() paste(false) end },
+ { 'left', function() prev_char() end },
+ { 'right', function() next_char() end },
+ { 'up', function() move_history(-1) end },
+ { 'wheel_up', function() move_history(-1) end },
+ { 'down', function() move_history(1) end },
+ { 'wheel_down', function() move_history(1) end },
+ { 'wheel_left', function() end },
+ { 'wheel_right', function() end },
+ { 'ctrl+left', prev_word },
+ { 'ctrl+right', next_word },
+ { 'tab', complete },
+ { 'home', go_home },
+ { 'end', go_end },
+ { 'pgup', handle_pgup },
+ { 'pgdwn', handle_pgdown },
+ { 'ctrl+c', clear },
+ { 'ctrl+d', maybe_exit },
+ { 'ctrl+k', del_to_eol },
+ { 'ctrl+l', clear_log_buffer },
+ { 'ctrl+u', del_to_start },
+ { 'ctrl+v', function() paste(true) end },
+ { 'meta+v', function() paste(true) end },
+ { 'ctrl+w', del_word },
+ { 'kp_dec', function() handle_char_input('.') end },
+ }
+
+ for i = 0, 9 do
+ bindings[#bindings + 1] =
+ {'kp' .. i, function() handle_char_input('' .. i) end}
+ end
-for i = 0, 9 do
- bindings[#bindings + 1] =
- {'kp' .. i, function() handle_char_input('' .. i) end}
+ return bindings
end
local function text_input(info)
@@ -705,7 +712,7 @@ function define_key_bindings()
if #key_bindings > 0 then
return
end
- for _, bind in ipairs(bindings) do
+ for _, bind in ipairs(get_bindings()) do
-- Generate arbitrary name for removing the bindings later.
local name = "_console_" .. (#key_bindings + 1)
key_bindings[#key_bindings + 1] = name
@@ -779,3 +786,5 @@ mp.register_event('log-message', function(e)
log_add(style, '[' .. e.prefix .. '] ' .. e.text)
end)
+
+collectgarbage()