aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--nvim/.config/nvim/lua/tobyvin/plugins/dap.lua20
-rw-r--r--nvim/.config/nvim/lua/tobyvin/plugins/dapui.lua10
-rw-r--r--nvim/.config/nvim/lua/tobyvin/plugins/mason-nvim-dap.lua7
-rw-r--r--nvim/.config/nvim/lua/tobyvin/utils/hover.lua91
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