Home Explore Blog CI



neovim

2nd chunk of `runtime/doc/lsp.txt`
414427be05a3cb500f0f93889bd224aeab398ed58f60760e0000000100000fa8
 |vim.diagnostic| (see
|vim.diagnostic.config()| to customize). It also sets various default options,
listed below, if (1) the language server supports the functionality and (2)
the options are empty or were set by the builtin runtime (ftplugin) files. The
options are not restored when the LSP client is stopped or detached.

GLOBAL DEFAULTS
                                          *grr* *gra* *grn* *gri* *i_CTRL-S*
These GLOBAL keymaps are created unconditionally when Nvim starts:
- "grn" is mapped in Normal mode to |vim.lsp.buf.rename()|
- "gra" is mapped in Normal and Visual mode to |vim.lsp.buf.code_action()|
- "grr" is mapped in Normal mode to |vim.lsp.buf.references()|
- "gri" is mapped in Normal mode to |vim.lsp.buf.implementation()|
- "gO" is mapped in Normal mode to |vim.lsp.buf.document_symbol()|
- CTRL-S is mapped in Insert mode to |vim.lsp.buf.signature_help()|

BUFFER-LOCAL DEFAULTS
- 'omnifunc' is set to |vim.lsp.omnifunc()|, use |i_CTRL-X_CTRL-O| to trigger
  completion.
- 'tagfunc' is set to |vim.lsp.tagfunc()|. This enables features like
  go-to-definition, |:tjump|, and keymaps like |CTRL-]|, |CTRL-W_]|,
  |CTRL-W_}| to utilize the language server.
- 'formatexpr' is set to |vim.lsp.formatexpr()|, so you can format lines via
  |gq| if the language server supports it.
  - To opt out of this use |gw| instead of gq, or clear 'formatexpr' on |LspAttach|.
- |K| is mapped to |vim.lsp.buf.hover()| unless |'keywordprg'| is customized or
  a custom keymap for `K` exists.

DISABLING DEFAULTS                                      *lsp-defaults-disable*
You can remove GLOBAL keymaps at any time using |vim.keymap.del()| or
|:unmap|. See also |gr-default|.

To remove or override BUFFER-LOCAL defaults, define a |LspAttach| handler: >lua

    vim.api.nvim_create_autocmd('LspAttach', {
      callback = function(args)
        -- Unset 'formatexpr'
        vim.bo[args.buf].formatexpr = nil
        -- Unset 'omnifunc'
        vim.bo[args.buf].omnifunc = nil
        -- Unmap K
        vim.keymap.del('n', 'K', { buffer = args.buf })
      end,
    })
<
==============================================================================
CONFIG                                                  *lsp-config*

You can configure LSP behavior statically via vim.lsp.config(), and
dynamically via |lsp-attach| or |Client:on_attach()|.

Use |vim.lsp.config()| to define, and selectively enable, LSP configurations.
This is basically a wrapper around |vim.lsp.start()| which allows you to share
and merge configs (which may be provided by Nvim or third-party plugins).

When an LSP client starts, it resolves its configuration by merging from the
following (in increasing priority):

1. Configuration defined for the `'*'` name.
2. Configuration from the result of merging all tables returned by
   `lsp/<name>.lua` files in 'runtimepath' for a server of name `name`.
3. Configurations defined anywhere else.

Note: The merge semantics of configurations follow the behaviour of
|vim.tbl_deep_extend()|.

Example: given the following configs... >lua
  -- Defined in init.lua
  vim.lsp.config('*', {
    capabilities = {
      textDocument = {
        semanticTokens = {
          multilineTokenSupport = true,
        }
      }
    },
    root_markers = { '.git' },
  })

  -- Defined in <rtp>/lsp/clangd.lua
  return {
    cmd = { 'clangd' },
    root_markers = { '.clangd', 'compile_commands.json' },
    filetypes = { 'c', 'cpp' },
  }

  -- Defined in init.lua
  vim.lsp.config('clangd', {
    filetypes = { 'c' },
  })
<
...the merged result is: >lua
  {
    -- From the clangd configuration in <rtp>/lsp/clangd.lua
    cmd = { 'clangd' },

    -- From the clangd configuration in <rtp>/lsp/clangd.lua
    -- Overrides the "*" configuration in init.lua
    root_markers = { '.clangd', 'compile_commands.json' },

    -- From the clangd configuration in init.lua
    -- Overrides the clangd configuration in <rtp>/lsp/clangd.lua
    filetypes = { 'c' },

    -- From the "*" configuration

Title: LSP Defaults and Configuration in Neovim
Summary
Neovim sets global keymaps and buffer-local defaults for LSP functionality, such as renaming, code actions, references, and code completion. These defaults can be disabled or overridden using `vim.keymap.del()` and the `LspAttach` handler. LSP behavior is configured statically via `vim.lsp.config()`, and dynamically via `lsp-attach` or `Client:on_attach()`. Configurations are merged from various sources with increasing priority, allowing for customization and extension of LSP features.