diff options
-rw-r--r-- | nvim/.config/nvim/lua/tobyvin/plugins/dap.lua | 20 | ||||
-rw-r--r-- | nvim/.config/nvim/lua/tobyvin/plugins/dapui.lua | 10 | ||||
-rw-r--r-- | nvim/.config/nvim/lua/tobyvin/plugins/mason-nvim-dap.lua | 7 | ||||
-rw-r--r-- | nvim/.config/nvim/lua/tobyvin/utils/hover.lua | 91 |
4 files changed, 80 insertions, 48 deletions
diff --git a/nvim/.config/nvim/lua/tobyvin/plugins/dap.lua b/nvim/.config/nvim/lua/tobyvin/plugins/dap.lua index 858855e..a787bed 100644 --- a/nvim/.config/nvim/lua/tobyvin/plugins/dap.lua +++ b/nvim/.config/nvim/lua/tobyvin/plugins/dap.lua @@ -181,14 +181,13 @@ M.setup = function() vim.keymap.set("n", "<F12>", dap.step_out, { desc = "Step Out", buffer = args.buf }) local dap_ui_widgets = require("dap.ui.widgets") - M.lsp_hover = vim.lsp.handlers["textDocument/hover"] - vim.lsp.handlers["textDocument/hover"] = function(...) - if M.hover_available() then - dap_ui_widgets.hover() - else - M.lsp_hover(...) - end - end + + vim.b[args.buf].dap_hover_id = utils.hover.register(dap_ui_widgets.hover, { + enabled = M.hover_available, + desc = "dap", + buffer = args.buf, + priority = 20, + }) end, }) @@ -205,10 +204,7 @@ M.setup = function() vim.keymap.del("n", "<F11>", { buffer = args.buf }) vim.keymap.del("n", "<F12>", { buffer = args.buf }) - if M.lsp_hover ~= nil then - vim.lsp.handlers["textDocument/hover"] = M.lsp_hover - M.lsp_hover = nil - end + utils.hover.unregister(vim.b[args.buf].dap_hover_id) end, }) diff --git a/nvim/.config/nvim/lua/tobyvin/plugins/dapui.lua b/nvim/.config/nvim/lua/tobyvin/plugins/dapui.lua index b392cc3..e12e67a 100644 --- a/nvim/.config/nvim/lua/tobyvin/plugins/dapui.lua +++ b/nvim/.config/nvim/lua/tobyvin/plugins/dapui.lua @@ -25,6 +25,10 @@ M.open = function() dapui.open({}) + dap.listeners.before.event_terminated["dapui_config"] = M.close + dap.listeners.before.event_exited["dapui_config"] = M.close + dap.listeners.before.disconnect["dapui_config"] = M.close + vim.keymap.set("n", "<leader>q", dap.terminate, { desc = "Quit (DAP)" }) vim.api.nvim_create_autocmd("TabClosed", { @@ -59,16 +63,10 @@ M.setup = function() return end - local dap = require("dap") - vim.keymap.set("n", "<leader>de", M.eval, { desc = "Eval" }) vim.keymap.set("n", "<leader>du", dapui.open, { desc = "DapUI" }) -- Attach DAP UI to DAP events - dap.listeners.before.event_terminated["dapui_config"] = M.close - dap.listeners.before.event_exited["dapui_config"] = M.close - dap.listeners.before.disconnect["dapui_config"] = M.close - vim.api.nvim_set_hl(0, "DapUIVariable", { link = "TSVariable" }) vim.api.nvim_set_hl(0, "DapUIScope", { link = "TSNamespace" }) vim.api.nvim_set_hl(0, "DapUIType", { link = "Type" }) diff --git a/nvim/.config/nvim/lua/tobyvin/plugins/mason-nvim-dap.lua b/nvim/.config/nvim/lua/tobyvin/plugins/mason-nvim-dap.lua index 3324bdd..d846c4e 100644 --- a/nvim/.config/nvim/lua/tobyvin/plugins/mason-nvim-dap.lua +++ b/nvim/.config/nvim/lua/tobyvin/plugins/mason-nvim-dap.lua @@ -13,12 +13,7 @@ M.setup = function() mason_nvim_dap.setup() - vim.api.nvim_create_autocmd("User", { - pattern = "DapAttach", - callback = function(args) - vim.keymap.set("n", "<leader>dI", M.install, { desc = "Dap Install", buffer = args.buf }) - end, - }) + vim.keymap.set("n", "<leader>dI", M.install, { desc = "Dap Install" }) end return M diff --git a/nvim/.config/nvim/lua/tobyvin/utils/hover.lua b/nvim/.config/nvim/lua/tobyvin/utils/hover.lua index 4f1fb32..f8f1bed 100644 --- a/nvim/.config/nvim/lua/tobyvin/utils/hover.lua +++ b/nvim/.config/nvim/lua/tobyvin/utils/hover.lua @@ -1,8 +1,20 @@ ---@diagnostic disable: missing-parameter local M = {} -M.providers = {} -M.buffers = {} +---@alias ProviderHandler fun():boolean? The handler for hover. Return true to indicate failure and skip +---@alias ProviderId number + +---@class ProviderOpts +---@field enabled fun():boolean +---@field buffer number +---@field priority number + +---@class Provider +---@field handler ProviderHandler +---@field opts ProviderOpts + +---@type Provider[] +vim.g.hover_providers = {} local default_opts = { enabled = function() @@ -10,54 +22,85 @@ local default_opts = { end, } -M.get_providers = function(buffer) - if buffer == nil then - return M.providers - else +---@param buffer number? +---@return Provider[] +M._get_providers = function(buffer) + if buffer then return vim.F.if_nil(vim.b[buffer].hover_providers, {}) + else + return vim.g.hover_providers end end -M.set_providers = function(buffer, providers) +---@param buffer number? +---@param providers Provider[] +M._set_providers = function(buffer, providers) if buffer == nil then - M.providers = providers + vim.g.hover_providers = providers else vim.b[buffer].hover_providers = providers end end -M.register = function(callback, opts) - opts = vim.F.if_nil(opts, default_opts) - local provider = vim.tbl_extend("keep", { callback = callback }, opts, default_opts) - local buffer = provider.buffer - local providers = M.get_providers(buffer) +---@param buffer number +---@return Provider[] +M.get_buf_providers = function(buffer) + local providers = {} + if vim.api.nvim_buf_is_valid(buffer) and type(vim.b[buffer].hover_providers) == "table" then + vim.list_extend(providers, M._get_providers(buffer)) + end + vim.list_extend(providers, M._get_providers()) + return providers +end + +---@param handler ProviderHandler +---@param opts ProviderOpts +---@return ProviderId +M.register = function(handler, opts) + ---@type ProviderOpts + opts = vim.F.if_nil(opts, {}) + opts = vim.tbl_extend("keep", opts, default_opts) + + ---@type Provider + local provider = { handler = handler, opts = opts } + + local providers = M._get_providers(provider.opts.buffer) + local id - if #providers > 0 and provider.priority then + if #providers > 0 and provider.opts.priority then for i, p in ipairs(providers) do - if not p.priority or p.priority < provider.priority or i == #providers then + if not p.opts.priority or p.opts.priority < provider.opts.priority or i == #providers then table.insert(providers, i, provider) + id = i break end end else table.insert(providers, provider) + id = #providers end - M.set_providers(buffer, providers) + M._set_providers(provider.opts.buffer, providers) + return id end -M.open = function() - local buffer = vim.api.nvim_get_current_buf() - local providers = {} +---@param id ProviderId +---@param buffer number? +M.unregister = function(id, buffer) + local providers = M._get_providers(buffer) - if vim.api.nvim_buf_is_valid(buffer) and type(vim.b[buffer].hover_providers) == "table" then - vim.list_extend(providers, vim.b[buffer].hover_providers) - end + local provider = table.remove(providers, id) - vim.list_extend(providers, M.providers) + M._set_providers(buffer, providers) + return provider +end +---@param buffer number? +M.open = function(buffer) + buffer = vim.F.if_nil(buffer, vim.api.nvim_get_current_buf()) + local providers = M.get_buf_providers(buffer) for _, provider in ipairs(providers) do - if provider.enabled() and not provider.callback() then + if provider.opts.enabled and provider.opts.enabled() and not provider.handler() then return true end end |