Skip to content

kiyoon/lsp-inlayhints.nvim

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

40 Commits
 
 
 
 
 
 
 
 

Repository files navigation

lsp-inlayhints.nvim

Partial implementation of LSP inlay hint.

Fork notice

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.

Installation

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.

on_attach

require("lsp-inlayhints").on_attach(client, bufnr)

LspAttach

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,
})

Configuration

If and which InlayHints are provided depends on the language server's configuration. Read their docs.

Highlight

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.

Default Configuration

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,
}

Languages

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.

Rust

If you're using rust-tools.nvim, set inlay_hints.auto to false.

require("rust-tools").setup({
    tools = {
        inlay_hints = {
            auto = false
        }
    }
})

TypeScript

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.

Clangd

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.

Golang

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
  }
}

Java (jdtls)

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.

Other

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.

Available commands:

toggle

Enable/disable the plugin globally.

require('lsp-inlayhints').toggle()

reset

Clears all inlay hints in the current buffer.

require('lsp-inlayhints').reset()

Known issues

InlayHints (extmarks) get pushed to the line below when commenting lines. See: lvimuser#2 (comment).

Missing

Acknowledgements

Originally based on simrat39's rust-tools.nvim implementation.

References:

  • nvim's builtin codelens
  • VSCode

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Lua 100.0%