aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/nvim
diff options
context:
space:
mode:
authorToby Vincent <tobyv13@gmail.com>2022-10-31 15:44:58 -0500
committerToby Vincent <tobyv13@gmail.com>2022-10-31 15:44:58 -0500
commit4f370c872ffb886dc3193a69dee09a912cfdc5d4 (patch)
tree5f7c1925b1fabe51c39ad4ec4007573718fe50f9 /nvim
parent9178dead94217252322c777458989da732ad0b82 (diff)
feat(nvim): add provider manager for hover
Diffstat (limited to 'nvim')
-rw-r--r--nvim/.config/nvim/lua/tobyvin/keymaps.lua9
-rw-r--r--nvim/.config/nvim/lua/tobyvin/lsp/handlers.lua4
-rw-r--r--nvim/.config/nvim/lua/tobyvin/utils/hover.lua66
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