diff options
| author | ii14 <59243201+ii14@users.noreply.github.com> | 2023-03-18 09:22:08 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-03-18 16:22:08 +0800 |
| commit | 5a871409199d585b52b69952532e3fb435e64566 (patch) | |
| tree | cec5ed98da796335cfa800ce5b14c414649ec192 /README.md | |
| parent | docs: update server_configurations.md (diff) | |
| download | nvim-lspconfig-5a871409199d585b52b69952532e3fb435e64566.tar nvim-lspconfig-5a871409199d585b52b69952532e3fb435e64566.tar.gz nvim-lspconfig-5a871409199d585b52b69952532e3fb435e64566.tar.bz2 nvim-lspconfig-5a871409199d585b52b69952532e3fb435e64566.tar.lz nvim-lspconfig-5a871409199d585b52b69952532e3fb435e64566.tar.xz nvim-lspconfig-5a871409199d585b52b69952532e3fb435e64566.tar.zst nvim-lspconfig-5a871409199d585b52b69952532e3fb435e64566.zip | |
docs: recommend LspAttach in readme (#2514)
Co-authored-by: ii14 <ii14@users.noreply.github.com>
Diffstat (limited to 'README.md')
| -rw-r--r-- | README.md | 103 |
1 files changed, 48 insertions, 55 deletions
@@ -12,7 +12,7 @@ See also `:help lsp-config`. [](https://luarocks.org/modules/neovim/nvim-lspconfig) -* Requires neovim version 0.7 above. Update Nvim and nvim-lspconfig before reporting an issue. +* Requires neovim version 0.8 above. Update Nvim and nvim-lspconfig before reporting an issue. * Install nvim-lspconfig like any other Vim plugin, e.g. with [packer.nvim](https://github.com/wbthomason/packer.nvim): ```lua local use = require('packer').use @@ -45,66 +45,59 @@ See [server_configurations.md](doc/server_configurations.md) (`:help lspconfig-a nvim-lspconfig does not set keybindings or enable completion by default. The following example configuration provides suggested keymaps for the most commonly used language server functions, and manually triggered completion with omnifunc (\<c-x\>\<c-o\>). -Note: you must pass the defined `on_attach` as an argument to **every `setup {}` call** and the keybindings in `on_attach` **only take effect on buffers with an active language server**. - ```lua --- Mappings. +-- Setup language servers. +local lspconfig = require('lspconfig') +lspconfig.pyright.setup {} +lspconfig.tsserver.setup {} +lspconfig.rust_analyzer.setup { + -- Server-specific settings. See `:help lspconfig-setup` + settings = { + ['rust-analyzer'] = {}, + }, +} + + +-- Global mappings. -- See `:help vim.diagnostic.*` for documentation on any of the below functions -local opts = { noremap=true, silent=true } -vim.keymap.set('n', '<space>e', vim.diagnostic.open_float, opts) -vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, opts) -vim.keymap.set('n', ']d', vim.diagnostic.goto_next, opts) -vim.keymap.set('n', '<space>q', vim.diagnostic.setloclist, opts) +vim.keymap.set('n', '<space>e', vim.diagnostic.open_float) +vim.keymap.set('n', '[d', vim.diagnostic.goto_prev) +vim.keymap.set('n', ']d', vim.diagnostic.goto_next) +vim.keymap.set('n', '<space>q', vim.diagnostic.setloclist) --- Use an on_attach function to only map the following keys +-- Use LspAttach autocommand to only map the following keys -- after the language server attaches to the current buffer -local on_attach = function(client, bufnr) - -- Enable completion triggered by <c-x><c-o> - vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc') - - -- Mappings. - -- See `:help vim.lsp.*` for documentation on any of the below functions - local bufopts = { noremap=true, silent=true, buffer=bufnr } - vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, bufopts) - vim.keymap.set('n', 'gd', vim.lsp.buf.definition, bufopts) - vim.keymap.set('n', 'K', vim.lsp.buf.hover, bufopts) - vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, bufopts) - vim.keymap.set('n', '<C-k>', vim.lsp.buf.signature_help, bufopts) - vim.keymap.set('n', '<space>wa', vim.lsp.buf.add_workspace_folder, bufopts) - vim.keymap.set('n', '<space>wr', vim.lsp.buf.remove_workspace_folder, bufopts) - vim.keymap.set('n', '<space>wl', function() - print(vim.inspect(vim.lsp.buf.list_workspace_folders())) - end, bufopts) - vim.keymap.set('n', '<space>D', vim.lsp.buf.type_definition, bufopts) - vim.keymap.set('n', '<space>rn', vim.lsp.buf.rename, bufopts) - vim.keymap.set('n', '<space>ca', vim.lsp.buf.code_action, bufopts) - vim.keymap.set('n', 'gr', vim.lsp.buf.references, bufopts) - vim.keymap.set('n', '<space>f', function() vim.lsp.buf.format { async = true } end, bufopts) -end +vim.api.nvim_create_autocmd('LspAttach', { + group = vim.api.nvim_create_augroup('UserLspConfig', {}), + callback = function(ev) + -- Enable completion triggered by <c-x><c-o> + vim.bo[ev.buf].omnifunc = 'v:lua.vim.lsp.omnifunc' -local lsp_flags = { - -- This is the default in Nvim 0.7+ - debounce_text_changes = 150, -} -require('lspconfig')['pyright'].setup{ - on_attach = on_attach, - flags = lsp_flags, -} -require('lspconfig')['tsserver'].setup{ - on_attach = on_attach, - flags = lsp_flags, -} -require('lspconfig')['rust_analyzer'].setup{ - on_attach = on_attach, - flags = lsp_flags, - -- Server-specific settings... - settings = { - ["rust-analyzer"] = {} - } -} + -- Buffer local mappings. + -- See `:help vim.lsp.*` for documentation on any of the below functions + local opts = { buffer = ev.buf } + vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, opts) + vim.keymap.set('n', 'gd', vim.lsp.buf.definition, opts) + vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts) + vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, opts) + vim.keymap.set('n', '<C-k>', vim.lsp.buf.signature_help, opts) + vim.keymap.set('n', '<space>wa', vim.lsp.buf.add_workspace_folder, opts) + vim.keymap.set('n', '<space>wr', vim.lsp.buf.remove_workspace_folder, opts) + vim.keymap.set('n', '<space>wl', function() + print(vim.inspect(vim.lsp.buf.list_workspace_folders())) + end, opts) + vim.keymap.set('n', '<space>D', vim.lsp.buf.type_definition, opts) + vim.keymap.set('n', '<space>rn', vim.lsp.buf.rename, opts) + vim.keymap.set('n', '<space>ca', vim.lsp.buf.code_action, opts) + vim.keymap.set('n', 'gr', vim.lsp.buf.references, opts) + vim.keymap.set('n', '<space>f', function() + vim.lsp.buf.format { async = true } + end, opts) + end, +}) ``` -Manual, triggered completion is provided by Nvim's builtin omnifunc. For *auto*completion, a general purpose [autocompletion plugin](https://github.com/neovim/nvim-lspconfig/wiki/Autocompletion) is required. +Manual, triggered completion is provided by Nvim's builtin omnifunc. For *auto*completion, a general purpose [autocompletion plugin](https://github.com/neovim/nvim-lspconfig/wiki/Autocompletion) is required. ## Troubleshooting @@ -115,7 +108,7 @@ The most common reasons a language server does not start or attach are: 1. The language server is not installed. nvim-lspconfig does not install language servers for you. You should be able to run the `cmd` defined in each server's Lua module from the command line and see that the language server starts. If the `cmd` is an executable name instead of an absolute path to the executable, ensure it is on your path. 2. Missing filetype plugins. Certain languages are not detecting by vim/neovim because they have not yet been added to the filetype detection system. Ensure `:set ft?` shows the filetype and not an empty value. 3. Not triggering root detection. **Some** language servers will only start if it is opened in a directory, or child directory, containing a file which signals the *root* of the project. Most of the time, this is a `.git` folder, but each server defines the root config in the lua file. See [server_configurations.md](doc/server_configurations.md) or the source for the list of root directories. -4. You must pass `on_attach` and `capabilities` for **each** `setup {}` if you want these to take effect. +4. You must pass `on_attach` and `capabilities` for **each** `setup {}` if you want these to take effect. 5. **Do not call `setup {}` twice for the same server**. The second call to `setup {}` will overwrite the first. Before reporting a bug, check your logs and the output of `:LspInfo`. Add the following to your init.vim to enable logging: |
