Minimal plugin that displays LSP inlay hints at the end of the line, rather than within the line.
Color scheme: nightfox.nvim, dawnfox variant
Requirements
textDocument/inlayHint
)-- lazy.nvim
{
"chrisgrieser/nvim-lsp-endhints",
event = "LspAttach",
opts = {}, -- required, even if empty
},
-- packer
use {
"chrisgrieser/nvim-lsp-endhints",
}
The .setup()
call is required.
-- default settings
require("lsp-endhints").setup {
icons = {
type = " ",
parameter = " ",
offspec = " ", -- hint kind not defined in official LSP spec
unknown = " ", -- hint kind is nil
},
label = {
truncateAtChars = 20,
padding = 1,
marginLeft = 0,
sameKindSeparator = ", ",
},
extmark = {
priority = 50,
},
autoEnableHints = true,
}
The hints use the default highlight group LspInlayHint
.
By default, the plugin automatically enables inlay hints when attaching to an LSP, there is nothing to do other than loading the plugin.
All regular inlay hint functions like vim.lsp.inlay_hint.enable()
work the
same as before. Use them as described in the Neovim
documentation
to enable/disable/toggle hints manually.
You can switch between displaying inlay hints at the end of the line (this plugin)
and within the line (Neovim default) by using the enable
, disable
and toggle
functions:
-- inlay hints will show at the end of the line (default)
require("lsp-endhints").enable()
-- inlay hints will show as if the plugin was not installed
require("lsp-endhints").disable()
-- toggle between the two
require("lsp-endhints").toggle()
nvim-lsp-endhints
just overrides the
textDocument/inlayHint
handler introduced in nvim 0.10, resulting in a much
simpler and more maintainable implementation (~250 LoC instead of ~1000 LoC).That is not supported by the plugin. However, it only takes a small snippet to implement it yourself. (Note that the linked snippet is not compatible with this plugin.)
[!NOTE] Not all LSPs support inlay hints. The following list is not exhaustive, there are more LSPs that support inlay hints. Please refer to your LSP's documentation.
-- lua-ls
require("lspconfig").lua_ls.setup {
settings = {
Lua = {
hint = { enable = true },
},
},
}
-- tsserver
local inlayHints = {
includeInlayParameterNameHints = "all",
includeInlayParameterNameHintsWhenArgumentMatchesName = false,
includeInlayFunctionParameterTypeHints = true,
includeInlayVariableTypeHints = true,
includeInlayVariableTypeHintsWhenTypeMatchesName = false,
includeInlayPropertyDeclarationTypeHints = true,
includeInlayFunctionLikeReturnTypeHints = true,
includeInlayEnumMemberValueHints = true,
}
require("lspconfig").tsserver.setup {
settings = {
typescript = {
inlayHints = inlayHints,
},
javascript = {
inlayHints = inlayHints,
},
},
}
-- gopls
require("lspconfig").gopls.setup {
settings = {
hints = {
rangeVariableTypes = true,
parameterNames = true,
constantValues = true,
assignVariableTypes = true,
compositeLiteralFields = true,
compositeLiteralTypes = true,
functionTypeParameters = true,
},
},
}
-- clangd
require("lspconfig").clangd.setup {
settings = {
clangd = {
InlayHints = {
Designators = true,
Enabled = true,
ParameterNames = true,
DeducedTypes = true,
},
fallbackFlags = { "-std=c++20" },
},
},
}
In my day job, I am a sociologist studying the social mechanisms underlying the digital economy. For my PhD project, I investigate the governance of the app economy and how software ecosystems manage the tension between innovation and compatibility. If you are interested in this subject, feel free to get in touch.
I also occasionally blog about vim: Nano Tips for Vim