diff options
| author | Simon Hauser <Simon-Hauser@outlook.de> | 2021-11-22 20:48:37 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-11-22 20:48:37 +0100 |
| commit | 6daf35c88c07dd4b220468968a742cda04889cd3 (patch) | |
| tree | 3f038291a7fda4555bcfb4891b5ea37b4542acc7 /lua/telescope | |
| parent | 6f82c6630cea83b591beeebdc760705cafa3e426 (diff) | |
fix: action mt so we can again concat actions from two different tables (#1143)
* fix: action mt so we can again concat actions from two different tables
- without actually changing the public interface
- without having a local table that keeps track of all actions
* this should clear actions now
we never actually called this function which is kinda a problem because
we never cleaned up previous mapping stores.
We can also make a better mappings store which has access to the keys
sequences which would help the showing actions part
* bugfix
* that should now clear everything
only tests left i think
* more tests
* cleanup
* hack: make sure all actions get cleared
Diffstat (limited to 'lua/telescope')
| -rw-r--r-- | lua/telescope/actions/mt.lua | 64 | ||||
| -rw-r--r-- | lua/telescope/mappings.lua | 10 | ||||
| -rw-r--r-- | lua/telescope/pickers.lua | 8 |
3 files changed, 59 insertions, 23 deletions
diff --git a/lua/telescope/actions/mt.lua b/lua/telescope/actions/mt.lua index adb3293..02edea5 100644 --- a/lua/telescope/actions/mt.lua +++ b/lua/telescope/actions/mt.lua @@ -14,7 +14,28 @@ local run_replace_or_original = function(replacements, original_func, ...) return original_func(...) end -action_mt.create = function(mod) +local append_action_copy = function(new, v, old) + table.insert(new, v) + new._func[v] = old._func[v] + new._static_pre[v] = old._static_pre[v] + new._pre[v] = old._pre[v] + new._replacements[v] = old._replacements[v] + new._static_post[v] = old._static_post[v] + new._post[v] = old._post[v] +end + +--TODO(conni2461): Not a fan of this solution/hack. Needs to be addressed +local all_mts = {} + +--- an action is metatable which allows replacement(prepend or append) of the function +---@class Action +---@field _func table<string, function>: the original action function +---@field _static_pre table<string, function>: will allways run before the function even if its replaced +---@field _pre table<string, function>: the functions that will run before the action +---@field _replacements table<string, function>: the function that replaces this action +---@field _static_post table<string, function>: will allways run after the function even if its replaced +---@field _post table<string, function>: the functions that will run after the action +action_mt.create = function() local mt = { __call = function(t, ...) local values = {} @@ -27,7 +48,7 @@ action_mt.create = function(mod) end local result = { - run_replace_or_original(t._replacements[action_name], mod[action_name], ...), + run_replace_or_original(t._replacements[action_name], t._func[action_name], ...), } for _, res in ipairs(result) do table.insert(values, res) @@ -45,18 +66,23 @@ action_mt.create = function(mod) end, __add = function(lhs, rhs) - local new_actions = {} + local new_action = setmetatable({}, action_mt.create()) for _, v in ipairs(lhs) do - table.insert(new_actions, v) + append_action_copy(new_action, v, lhs) end for _, v in ipairs(rhs) do - table.insert(new_actions, v) + append_action_copy(new_action, v, rhs) + end + new_action.clear = function() + lhs.clear() + rhs.clear() end - return setmetatable(new_actions, getmetatable(lhs)) + return new_action end, + _func = {}, _static_pre = {}, _pre = {}, _replacements = {}, @@ -120,33 +146,47 @@ action_mt.create = function(mod) return self end + table.insert(all_mts, mt) return mt end -action_mt.transform = function(k, mt, mod, v) +action_mt.transform = function(k, mt, _, v) local res = setmetatable({ k }, mt) if type(v) == "table" then res._static_pre[k] = v.pre res._static_post[k] = v.post - mod[k] = v.action + res._func[k] = v.action + else + res._func[k] = v end return res end action_mt.transform_mod = function(mod) - local mt = action_mt.create(mod) - -- Pass the metatable of the module if applicable. -- This allows for custom errors, lookups, etc. local redirect = setmetatable({}, getmetatable(mod) or {}) for k, v in pairs(mod) do - redirect[k] = action_mt.transform(k, mt, mod, v) + local mt = action_mt.create() + redirect[k] = action_mt.transform(k, mt, _, v) end - redirect._clear = mt.clear + redirect._clear = function() + for k, v in pairs(redirect) do + if k ~= "_clear" then + pcall(v.clear) + end + end + end return redirect end +action_mt.clear_all = function() + for _, v in ipairs(all_mts) do + pcall(v.clear) + end +end + return action_mt diff --git a/lua/telescope/mappings.lua b/lua/telescope/mappings.lua index 27e5d07..b78923f 100644 --- a/lua/telescope/mappings.lua +++ b/lua/telescope/mappings.lua @@ -221,10 +221,6 @@ mappings.apply_keymap = function(prompt_bufnr, attach_mappings, buffer_keymap) end end end - - vim.cmd( - string.format([[autocmd BufDelete %s :lua require('telescope.mappings').clear(%s)]], prompt_bufnr, prompt_bufnr) - ) end mappings.execute_keymap = function(prompt_bufnr, keymap_identifier) @@ -237,6 +233,12 @@ mappings.execute_keymap = function(prompt_bufnr, keymap_identifier) end mappings.clear = function(prompt_bufnr) + require("telescope.actions.mt").clear_all() + -- TODO(conni2461): This seems like the better solution but it won't clear actions that were never mapped + -- for _, v in ipairs(keymap_store[prompt_bufnr]) do + -- pcall(v.clear) + -- end + keymap_store[prompt_bufnr] = nil end diff --git a/lua/telescope/pickers.lua b/lua/telescope/pickers.lua index bda4d53..936f377 100644 --- a/lua/telescope/pickers.lua +++ b/lua/telescope/pickers.lua @@ -8,7 +8,6 @@ local channel = require("plenary.async.control").channel local popup = require "plenary.popup" local actions = require "telescope.actions" -local action_set = require "telescope.actions.set" local config = require "telescope.config" local debounce = require "telescope.debounce" local deprecated = require "telescope.deprecated" @@ -48,12 +47,6 @@ function Picker:new(opts) error "layout_strategy and get_window_options are not compatible keys" end - -- Reset actions for any replaced / enhanced actions. - -- TODO: Think about how we could remember to NOT have to do this... - -- I almost forgot once already, cause I'm not smart enough to always do it. - actions._clear() - action_set._clear() - deprecated.options(opts) local layout_strategy = get_default(opts.layout_strategy, config.values.layout_strategy) @@ -1304,6 +1297,7 @@ function pickers.on_close_prompt(prompt_bufnr) end picker.close_windows(status) + mappings.clear(prompt_bufnr) end function pickers.on_resize_window(prompt_bufnr) |
