General framework for context aware hover providers (similar to vim.lsp.buf.hover
).
Requires Nvim v0.10.0
LSP | Github Issues |
![]() |
![]() |
Dictionary | Github User |
![]() |
![]() |
via packer:
use {
"lewis6991/hover.nvim",
config = function()
require("hover").setup {
init = function()
-- Require providers
require("hover.providers.lsp")
-- require('hover.providers.gh')
-- require('hover.providers.gh_user')
-- require('hover.providers.jira')
-- require('hover.providers.dap')
-- require('hover.providers.fold_preview')
-- require('hover.providers.diagnostic')
-- require('hover.providers.man')
-- require('hover.providers.dictionary')
end,
preview_opts = {
border = 'single'
},
-- What to do if hover() is called when a hover popup is already open:
-- "cycle_providers" - cycle to the next enabled provider
-- "focus" - move the cursor into the popup
-- "preview_window" - move the popup contents to a :h preview-window
-- "close" - close the popup
-- "ignore" - do nothing
multiple_hover = "cycle_providers"
title = true,
mouse_providers = {
'LSP'
},
mouse_delay = 1000
}
-- Setup keymaps
vim.keymap.set("n", "K", require("hover").hover, {desc = "hover.nvim"})
vim.keymap.set("n", "gK", require("hover").hover_select, {desc = "hover.nvim (select)"})
vim.keymap.set("n", "<C-p>", function() require("hover").hover_switch("previous") end, {desc = "hover.nvim (previous source)"})
vim.keymap.set("n", "<C-n>", function() require("hover").hover_switch("next") end, {desc = "hover.nvim (next source)"})
-- Mouse support
vim.keymap.set('n', '<MouseMove>', require('hover').hover_mouse, { desc = "hover.nvim (mouse)" })
vim.o.mousemoveevent = true
end)
end
}
require('hover.providers.lsp')
Builtin LSP
Priority: 1000
require('hover.providers.diagnostic')
Diagnostics using vim.diagnostic
Priority: 1001
require('hover.providers.dap')
DAP hover
Priority: 1002
require('hover.providers.fold_preview')
Preview closed fold under cursor
Priority: 1003
require('hover.providers.gh')
Opens issue/PR's for symbols like #123
.
Requires the gh
command.
Priority: 200
require('hover.providers.gh_user')
Information for github users in TODO
comments.
Matches TODO(<user>)
and TODO(@<user>)
.
Requires the gh
command.
Priority: 200
require('hover.providers.jira')
Opens issue for symbols like ABC-123
.
Requires the jira
command.
Priority: 175
require('hover.providers.man')
man
entries
Priority: 150
require('hover.providers.dictionary')
Definitions for valid words
Priority: 100
Call require('hover').register(<provider>)
with a table containing the following fields:
name
: string, name of the hover providerenabled
: function, whether the hover is active for the current contextexecute
: function, executes the hover. Has the following arguments:opts
: Additional options:bufnr
(integer)winid
(integer)pos
({[1]: integer, [2]: integer})
done
: callback. First argument should be passed:nil
if the hover failed to execute. This will allow other lower priority hovers to run.- A table with the following fields:
lines
(string array)filetype
(string)bufnr
(integer?) use a pre-populated buffer for the hover window. Ignoreslines
.
priority
: number (optional), priority of the provider
-- Simple
require('hover').register {
name = 'Simple',
--- @param bufnr integer
enabled = function(bufnr)
return true
end,
--- @param opts Hover.Options
--- @param done fun(result?: Hover.Result)
execute = function(opts, done)
done{lines={'TEST'}, filetype="markdown"}
end
}
--- @class Hover.Options
--- @field bufnr integer
--- @field winid integer
--- (1,0)-based
--- @field pos {[1]: integer, [2]: integer}
--- @field providers? string[]
--- @class Hover.Result
--- @field lines? string[]
--- @field bufnr? integer
--- @field filetype? string