Partial implementation of LSP inlay hint.
This fork fixes the problem of inlay hints being displayed multiple times on some servers due to the server not respecting the range of the requested inlay hints. See basedpyright#207.
Add lvimuser/lsp-inlayhints.nvim
using your favorite plugin manager and call
require("lsp-inlayhints").setup()
. See Configuration.
You can lazy load it on module
or LspAttach
event if you're calling it
after nvim has attached the server.
require("lsp-inlayhints").on_attach(client, bufnr)
For >0.8, you can use the LspAttach
event:
vim.api.nvim_create_augroup("LspAttach_inlayhints", {})
vim.api.nvim_create_autocmd("LspAttach", {
group = "LspAttach_inlayhints",
callback = function(args)
if not (args.data and args.data.client_id) then
return
end
local bufnr = args.buf
local client = vim.lsp.get_client_by_id(args.data.client_id)
require("lsp-inlayhints").on_attach(client, bufnr)
end,
})
If and which InlayHints
are provided depends on the language server's configuration. Read their docs.
Highlight group is LspInlayHint
; defaults to Comment
foreground with CursorLine
background, creating a 'block'-like effect.
A common suggestion is to use Comment
, either by linking it (hi link LspInlayHint Comment
) or setting it in the options.
VSCode's dark theme is similar to hi LspInlayHint guifg=#d8d8d8 guibg=#3a3a3a
.
You only need to pass the options you want to override.
local default_config = {
inlay_hints = {
parameter_hints = {
show = true,
prefix = "<- ",
separator = ", ",
remove_colon_start = false,
remove_colon_end = true,
},
type_hints = {
-- type and other hints
show = true,
prefix = "",
separator = ", ",
remove_colon_start = false,
remove_colon_end = false,
},
only_current_line = false,
-- separator between types and parameter hints. Note that type hints are
-- shown before parameter
labels_separator = " ",
-- whether to align to the length of the longest line in the file
max_len_align = false,
-- padding from the left if max_len_align is true
max_len_align_padding = 1,
-- highlight group
highlight = "LspInlayHint",
-- virt_text priority
priority = 0,
},
enabled_at_startup = true,
debug_mode = false,
}
Should work for all languages that implement the spec. Tested on rust-analyzer (via rust-tools.nvim)
, fsautocomplete (via ionide.vim)
, sumneko_lua
, gopls
, tsserver
.
If you're using rust-tools.nvim
, set inlay_hints.auto
to false.
require("rust-tools").setup({
tools = {
inlay_hints = {
auto = false
}
}
})
tsserver
is spec compliant from v1.1.0 onwards. If you're using an older version, add
require("lsp-inlayhints.adapter").set_old_tsserver()
.
See typescript-language-server#workspacedidchangeconfiguration.
Example configuration to enable inlay hints in TypeScript and JavaScript, using lspconfig:
lspconfig.tsserver.setup({
settings = {
typescript = {
inlayHints = {
includeInlayParameterNameHints = 'all',
includeInlayParameterNameHintsWhenArgumentMatchesName = false,
includeInlayFunctionParameterTypeHints = true,
includeInlayVariableTypeHints = true,
includeInlayVariableTypeHintsWhenTypeMatchesName = false,
includeInlayPropertyDeclarationTypeHints = true,
includeInlayFunctionLikeReturnTypeHints = true,
includeInlayEnumMemberValueHints = true,
}
},
javascript = {
inlayHints = {
includeInlayParameterNameHints = 'all',
includeInlayParameterNameHintsWhenArgumentMatchesName = false,
includeInlayFunctionParameterTypeHints = true,
includeInlayVariableTypeHints = true,
includeInlayVariableTypeHintsWhenTypeMatchesName = false,
includeInlayPropertyDeclarationTypeHints = true,
includeInlayFunctionLikeReturnTypeHints = true,
includeInlayEnumMemberValueHints = true,
}
}
}
})
You might want to set VariableTypeHints
to false
if it's too noisy.
If you're on a version earlier than 15.0.0, you must use an older commit.
See https://clangd.llvm.org/extensions#inlay-hints and https://clangd.llvm.org/config#inlayhints.
If using p00f/clangd_extensions.nvim
, set autoSetHints = false
.
See https://github.com/golang/tools/blob/master/gopls/doc/inlayHints.md. If you're using ray-x/go.nvim
, set lsp_inlay_hints = { enable = false }
.
Example
"gopls": {
"hints": {
"assignVariableTypes": true,
"compositeLiteralFields": true,
"constantValues": true,
"functionTypeParameters": true,
"parameterNames": true,
"rangeVariableTypes": true
}
}
Available settings: https://github.com/redhat-developer/vscode-java/blob/master/package.json#L892-L916.
- Server doesn't set
inlayHintProvider
capability. - Server doesn't specify InlayHintKind and its options refer only to parameters.
Builtin workaround: attach regardless and treat unspecified hints as Parameter
.
If a server implements inlay hints on a different endpoint/method (not
textDocument/inlayHint
), raise an issue with the request/response details to
check the possibility of a workaround.
Enable/disable the plugin globally.
require('lsp-inlayhints').toggle()
Clears all inlay hints in the current buffer.
require('lsp-inlayhints').reset()
InlayHints (extmarks) get pushed to the line below when commenting lines. See: lvimuser#2 (comment).
- Resolve request
- Command|Execute|TextEdits. Ref: inlayHintLabelPart
Originally based on simrat39's rust-tools.nvim implementation.
References:
- nvim's builtin codelens
- VSCode