diff options
author | Toby Vincent <tobyv13@gmail.com> | 2022-10-31 15:44:58 -0500 |
---|---|---|
committer | Toby Vincent <tobyv13@gmail.com> | 2022-10-31 15:44:58 -0500 |
commit | 4f370c872ffb886dc3193a69dee09a912cfdc5d4 (patch) | |
tree | 5f7c1925b1fabe51c39ad4ec4007573718fe50f9 /nvim | |
parent | 9178dead94217252322c777458989da732ad0b82 (diff) |
feat(nvim): add provider manager for hover
Diffstat (limited to 'nvim')
-rw-r--r-- | nvim/.config/nvim/lua/tobyvin/keymaps.lua | 9 | ||||
-rw-r--r-- | nvim/.config/nvim/lua/tobyvin/lsp/handlers.lua | 4 | ||||
-rw-r--r-- | nvim/.config/nvim/lua/tobyvin/utils/hover.lua | 66 |
3 files changed, 77 insertions, 2 deletions
diff --git a/nvim/.config/nvim/lua/tobyvin/keymaps.lua b/nvim/.config/nvim/lua/tobyvin/keymaps.lua index 8e3ff40..8cd0c56 100644 --- a/nvim/.config/nvim/lua/tobyvin/keymaps.lua +++ b/nvim/.config/nvim/lua/tobyvin/keymaps.lua @@ -17,6 +17,15 @@ M.setup = function() vim.keymap.set("n", "gp", "<cmd>bprev<cr>", { desc = "bprev" }) vim.keymap.set("n", "gb", utils.buffer.bselect, { desc = "bselect" }) vim.keymap.set("n", "gk", utils.documentation.open, { desc = "Documentation" }) + vim.keymap.set("n", "K", function() + if utils.hover.open() then + -- Fix for diagnostics immediately overriding hover window + vim.api.nvim_command("set eventignore=CursorHold") + vim.api.nvim_command('autocmd CursorMoved <buffer> ++once set eventignore=""') + return "<Ignore>" + end + return "K" + end, { expr = true, desc = "Hover" }) vim.keymap.set("n", "<leader>q", "<cmd>qall<cr>", { desc = "quit" }) vim.keymap.set("n", "<leader>c", utils.buffer.bdelete, { desc = "bdelete" }) diff --git a/nvim/.config/nvim/lua/tobyvin/lsp/handlers.lua b/nvim/.config/nvim/lua/tobyvin/lsp/handlers.lua index 761b1e6..a0ad173 100644 --- a/nvim/.config/nvim/lua/tobyvin/lsp/handlers.lua +++ b/nvim/.config/nvim/lua/tobyvin/lsp/handlers.lua @@ -73,9 +73,9 @@ M.setup = function() vim.bo[bufnr].tagfunc = "v:lua.vim.lsp.tagfunc" end - vim.keymap.set("n", "<C-k>", vim.lsp.buf.signature_help, { desc = "Signature Help", buffer = bufnr }) - vim.keymap.set("n", "K", vim.lsp.buf.hover, { desc = "Hover", buffer = bufnr }) + utils.hover.register(vim.lsp.buf.hover, { buffer = bufnr, priority = 1 }) + vim.keymap.set("n", "<C-k>", vim.lsp.buf.signature_help, { desc = "Signature Help", buffer = bufnr }) vim.keymap.set("n", "gd", vim.lsp.buf.definition, { desc = "Definition", buffer = bufnr }) vim.keymap.set("n", "gD", vim.lsp.buf.declaration, { desc = "Declaration", buffer = bufnr }) vim.keymap.set("n", "gT", vim.lsp.buf.type_definition, { desc = "Type", buffer = bufnr }) diff --git a/nvim/.config/nvim/lua/tobyvin/utils/hover.lua b/nvim/.config/nvim/lua/tobyvin/utils/hover.lua new file mode 100644 index 0000000..4f1fb32 --- /dev/null +++ b/nvim/.config/nvim/lua/tobyvin/utils/hover.lua @@ -0,0 +1,66 @@ +---@diagnostic disable: missing-parameter +local M = {} + +M.providers = {} +M.buffers = {} + +local default_opts = { + enabled = function() + return true + end, +} + +M.get_providers = function(buffer) + if buffer == nil then + return M.providers + else + return vim.F.if_nil(vim.b[buffer].hover_providers, {}) + end +end + +M.set_providers = function(buffer, providers) + if buffer == nil then + M.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) + + if #providers > 0 and provider.priority then + for i, p in ipairs(providers) do + if not p.priority or p.priority < provider.priority or i == #providers then + table.insert(providers, i, provider) + break + end + end + else + table.insert(providers, provider) + end + + M.set_providers(buffer, providers) +end + +M.open = function() + local buffer = vim.api.nvim_get_current_buf() + local providers = {} + + 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 + + vim.list_extend(providers, M.providers) + + for _, provider in ipairs(providers) do + if provider.enabled() and not provider.callback() then + return true + end + end +end + +return M |