From b10b02f0b4f238f55e0236470234d1712b22c9ac Mon Sep 17 00:00:00 2001 From: Marc Jakobi Date: Fri, 24 May 2024 20:27:00 +0200 Subject: [PATCH] chore: rework handler add signatures --- lua/lz/n/handler/cmd.lua | 18 ++++++++---------- lua/lz/n/handler/event.lua | 17 ++++++++++++----- lua/lz/n/handler/ft.lua | 6 +++--- lua/lz/n/handler/init.lua | 3 +-- lua/lz/n/handler/keys.lua | 19 +++++++++++++------ lua/lz/n/types.lua | 2 +- 6 files changed, 38 insertions(+), 27 deletions(-) diff --git a/lua/lz/n/handler/cmd.lua b/lua/lz/n/handler/cmd.lua index ab0925c..a889f95 100644 --- a/lua/lz/n/handler/cmd.lua +++ b/lua/lz/n/handler/cmd.lua @@ -4,19 +4,18 @@ local loader = require('lz.n.loader') ---@type LzCmdHandler local M = { - active = {}, - managed = {}, + pending = {}, type = 'cmd', } ---@param cmd string local function load(cmd) vim.api.nvim_del_user_command(cmd) - loader.load(M.active[cmd]) + loader.load(vim.tbl_values(M.pending[cmd])) end ---@param cmd string -local function add(cmd) +local function add_cmd(cmd) vim.api.nvim_create_user_command(cmd, function(event) ---@cast event vim.api.keyset.user_command local command = { @@ -37,14 +36,13 @@ local function add(cmd) command.range = { event.line1, event.line2 } end - ---@type string - local plugins = '`' .. table.concat(vim.tbl_values(M.active[cmd]), ', ') .. '`' - load(cmd) local info = vim.api.nvim_get_commands({})[cmd] or vim.api.nvim_buf_get_commands(0, {})[cmd] if not info then vim.schedule(function() + ---@type string + local plugins = '`' .. table.concat(vim.tbl_values(M.pending[cmd]), ', ') .. '`' vim.notify('Command `' .. cmd .. '` not found after loading ' .. plugins, vim.log.levels.ERROR) end) return @@ -79,9 +77,9 @@ function M.add(plugin) return end for _, cmd in pairs(plugin.cmd) do - M.active[cmd] = M.active[cmd] or {} - M.active[cmd][plugin.name] = plugin.name - add(cmd) + M.pending[cmd] = M.pending[cmd] or {} + M.pending[cmd][plugin.name] = plugin.name + add_cmd(cmd) end end diff --git a/lua/lz/n/handler/event.lua b/lua/lz/n/handler/event.lua index d7dfd03..28d3225 100644 --- a/lua/lz/n/handler/event.lua +++ b/lua/lz/n/handler/event.lua @@ -13,8 +13,7 @@ local loader = require('lz.n.loader') ---@type LzEventHandler local M = { - active = {}, - managed = {}, + pending = {}, type = 'event', } @@ -121,21 +120,21 @@ local function trigger(opts) end ---@param event LzEvent -function M.add(event) +local function add_event(event) local done = false vim.api.nvim_create_autocmd(event.event, { group = M.group, once = true, pattern = event.pattern, callback = function(ev) - if done or not M.active[event.id] then + if done or not M.pending[event.id] then return end -- HACK: work-around for https://github.com/neovim/neovim/issues/25526 done = true local state = get_state(ev.event, ev.buf, ev.data) -- load the plugins - loader.load(M.active[event.id]) + loader.load(M.pending[event.id]) -- check if any plugin created an event handler for this event and fire the group for _, s in ipairs(state) do trigger(s) @@ -144,4 +143,12 @@ function M.add(event) }) end +---@param plugin LzPlugin +function M.add(plugin) + -- TODO add plugin to M.pending + for _, event in pairs(plugin.event or {}) do + add_event(event) + end +end + return M diff --git a/lua/lz/n/handler/ft.lua b/lua/lz/n/handler/ft.lua index 6edde00..709747f 100644 --- a/lua/lz/n/handler/ft.lua +++ b/lua/lz/n/handler/ft.lua @@ -19,9 +19,9 @@ function M.parse(value) } end ----@param lz_event LzEvent -function M.add(lz_event) - event.add(lz_event) +---@param plugin LzPlugin +function M.add(plugin) + event.add(plugin) end return M diff --git a/lua/lz/n/handler/init.lua b/lua/lz/n/handler/init.lua index e3435e7..3540339 100644 --- a/lua/lz/n/handler/init.lua +++ b/lua/lz/n/handler/init.lua @@ -1,7 +1,6 @@ ---@class LzHandler ---@field type LzHandlerTypes ----@field active table> ----@field managed table +---@field pending table> -- key: plugin_name: plugin_name ---@field add fun(plugin: LzPlugin) ---@field del? fun(plugin: LzPlugin) diff --git a/lua/lz/n/handler/keys.lua b/lua/lz/n/handler/keys.lua index 1b42843..5a40190 100644 --- a/lua/lz/n/handler/keys.lua +++ b/lua/lz/n/handler/keys.lua @@ -4,8 +4,7 @@ local loader = require('lz.n.loader') ---@type LzKeysHandler local M = { - active = {}, - managed = {}, + pending = {}, type = 'keys', } @@ -74,17 +73,17 @@ local function del(keys) end ---@param keys LzKeys -M.add = function(keys) +local function add_keys(keys) local lhs = keys.lhs local opts = get_opts(keys) ---@param buf? number local function add(buf) vim.keymap.set(keys.mode, lhs, function() - local plugins = M.active[keys.id] + local plugins = M.pending[keys.id] -- always delete the mapping immediately to prevent recursive mappings del(keys) - M.active[keys.id] = nil + M.pending[keys.id] = nil if plugins then loader.load(plugins) end @@ -111,7 +110,7 @@ M.add = function(keys) vim.api.nvim_create_autocmd('FileType', { pattern = keys.ft, callback = function(event) - if M.active[keys.id] then + if M.pending[keys.id] then add(event.buf) else -- Only create the mapping if its managed by lz.n @@ -125,4 +124,12 @@ M.add = function(keys) end end +---@param plugin LzPlugin +function M.add(plugin) + -- TODO add plugin to M.pending + for _, key in pairs(plugin.keys or {}) do + add_keys(key) + end +end + return M diff --git a/lua/lz/n/types.lua b/lua/lz/n/types.lua index ce55af8..1520e51 100644 --- a/lua/lz/n/types.lua +++ b/lua/lz/n/types.lua @@ -31,7 +31,7 @@ error('Cannot import a meta module') ---@field after? fun(self:LzPlugin, opts:table)|true Will be executed when loading the plugin ---@field opts? PluginOpts ----@class LzPluginHandlers +---@class LzPluginHandlers -- keys = plugin names ---@field event? table ---@field ft? table ---@field keys? table