
Expandable TypeScript type inspection for NeoVim. Uses TypeScript 5.9's verbosityLevel API to let you progressively expand and collapse type aliases directly inside a hover float.
+ to expand type aliases one level at a time, - to collapse@param/@returns/@example tags rendered below the type blockvim.lsp.buf.hover() when vtsls is not attached or TypeScript < 5.9verbosityLevel support in tsserver's quickinfo)-- lazy.nvim
{
"nemanjamalesija/ts-expand-hover.nvim",
ft = { "typescript", "typescriptreact" },
opts = {
keymaps = { hover = "<leader>th" },
},
}
For other plugin managers, call require("ts_expand_hover").setup() after loading.
Calling setup() with no arguments uses all defaults:
require("ts_expand_hover").setup({
keymaps = {
hover = "K", -- normal mode key to open hover float
expand = "+", -- expand type one level (inside float)
collapse = "-", -- collapse type one level (inside float)
close = { "q", "<Esc>" }, -- close float and return to source
},
float = {
border = "rounded", -- "rounded", "single", "double", "none"
max_width = 80,
max_height = 30,
},
})
Set any keymap to false to prevent the plugin from registering it, so you can bind it yourself:
require("ts_expand_hover").setup({
keymaps = { hover = false },
})
-- TypeScript-only mapping to avoid conflicts with other plugins that map K
vim.api.nvim_create_autocmd("FileType", {
pattern = { "typescript", "typescriptreact" },
callback = function(ev)
vim.keymap.set("n", "K", require("ts_expand_hover").hover, {
buffer = ev.buf,
desc = "TypeScript expandable hover",
})
end,
})
| Key | Scope | Action |
|---|---|---|
K |
Normal mode (global) | Open hover float at cursor |
+ |
Inside float | Expand type one level |
- |
Inside float | Collapse type one level |
q / Esc |
Inside float | Close float, return focus to source |
The float closes automatically when you move the cursor in the source buffer. The footer shows the current verbosity depth and available actions. When maximum expansion is reached, the footer shows [max].
Run :checkhealth ts_expand_hover to verify your setup (NeoVim version, vtsls attachment, TypeScript version). Open a TypeScript file first so vtsls has a chance to attach.
The plugin sends typescript.tsserverRequest commands to vtsls via workspace/executeCommand. It passes the verbosityLevel parameter (TypeScript 5.9) to tsserver's quickinfo command, controlling how deeply type aliases are expanded.
K — sends a quickinfo request with verbosityLevel: 0+ — increments verbosity and re-requests; the float updates in-place- — decrements verbosity and re-requestsWhen vtsls is not attached or TypeScript < 5.9 is detected, the plugin falls back to vim.lsp.buf.hover().
Hover shows the standard LSP float — vtsls is not attached. Run :checkhealth ts_expand_hover and make sure your LSP config starts vtsls for TypeScript files.
Pressing + does nothing — either the footer shows [max] (fully expanded), or TypeScript < 5.9 is in use.
Float doesn't open — NeoVim < 0.10 is required for the footer option in nvim_open_win. Also verify setup() was called.
K is already bound — use a custom hover key (e.g. hover = "<leader>th") or disable the global mapping and remap per-filetype (see Configuration above).
make test
Requires NeoVim and plenary.nvim. Tests run headlessly with no live LSP dependency.
MIT