" Set completeopt to have a better completion experience " :help completeopt " menuone: popup even when there's only one match " noinsert: Do not insert text until a selection is made " noselect: Do not select, force user to select one from the menu set completeopt=menuone,noinsert,noselect " Avoid showing extra messages when using completion set shortmess+=c " Configure neovim 5 experimental LSPs " https://github.com/neovim/nvim-lspconfig " https://github.com/neovim/nvim-lspconfig/blob/master/CONFIG.md " https://gitlab.com/Iron_E/dotfiles/-/blob/master/.config/nvim/lua/_config/plugin/nvim_lsp.lua lua < buf_set_option('omnifunc', 'v:lua.vim.lsp.omnifunc') -- Mappings. local opts = { noremap=true, silent=true } -- See `:help vim.lsp.*` for documentation on any of the below functions buf_set_keymap('n', 'gD', 'lua vim.lsp.buf.declaration()', opts) buf_set_keymap('n', 'gd', 'lua vim.lsp.buf.definition()', opts) buf_set_keymap('n', 'K', 'lua vim.lsp.buf.hover()', opts) buf_set_keymap('n', 'gi', 'lua vim.lsp.buf.implementation()', opts) buf_set_keymap('n', '', 'lua vim.lsp.buf.signature_help()', opts) buf_set_keymap('n', 'wa', 'lua vim.lsp.buf.add_workspace_folder()', opts) buf_set_keymap('n', 'wr', 'lua vim.lsp.buf.remove_workspace_folder()', opts) buf_set_keymap('n', 'wl', 'lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))', opts) buf_set_keymap('n', 'D', 'lua vim.lsp.buf.type_definition()', opts) buf_set_keymap('n', 'rn', 'lua vim.lsp.buf.rename()', opts) buf_set_keymap('n', 'ca', 'lua vim.lsp.buf.code_action()', opts) buf_set_keymap('n', 'gr', 'lua vim.lsp.buf.references()', opts) buf_set_keymap('n', 'e', 'lua vim.lsp.diagnostic.show_line_diagnostics()', opts) buf_set_keymap('n', 'dp', 'lua vim.lsp.diagnostic.goto_prev()', opts) buf_set_keymap('n', 'dn', 'lua vim.lsp.diagnostic.goto_next()', opts) buf_set_keymap('n', 'q', 'lua vim.lsp.diagnostic.set_loclist()', opts) buf_set_keymap('n', 'f', 'lua vim.lsp.buf.formatting()', opts) end -- Add additional capabilities supported by nvim-cmp local capabilities = vim.lsp.protocol.make_client_capabilities() capabilities = require('cmp_nvim_lsp').update_capabilities(capabilities) -- vscode HTML lsp needs this https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md#html capabilities.textDocument.completion.completionItem.snippetSupport = true for lsp_key, lsp_settings in pairs({ 'bashls', ------------------------------- Bash 'ccls', --------------------------------- C / C++ / Objective-C 'cssls', -------------------------------- CSS / SCSS / LESS 'dockerls', ----------------------------- Docker ['gopls'] = { --------------------------- Go ['settings'] = { ['gopls'] = { ['analyses'] = { ['unusedparams'] = true, }, ['staticcheck'] = true }, }, }, 'html', --------------------------------- HTML ['jdtls'] = { --------------------------- Java ['root_dir'] = nvim_lsp.util.root_pattern('.git', 'pom.xml', 'build.xml'), ['init_options'] = { ['jvm_args'] = {['java.format.settings.url'] = vim.fn.stdpath('config')..'/eclipse-formatter.xml'}, ['workspace'] = vim.fn.stdpath('cache')..'/java-workspaces' } }, ['jsonls'] = { -------------------------- JSON ['settings'] = { ['json'] = { ['schemas' ] = require('schemastore').json.schemas() } } }, 'phpactor', ----------------------------- PHP 'pylsp', -------------------------------- Python 'rnix', --------------------------------- Nix 'solargraph', --------------------------- Ruby 'rust_analyzer', ------------------------ Rust ['sqlls'] = { ['cmd'] = {"$XDG_DATA_HOME/nvm/versions/node/v12.19.0/bin/sql-language-server", "up", "--method", "stdio"} }, ['terraformls'] = { --------------------- Terraform ['filetypes'] = { "terraform", "hcl", "tf" } }, 'tsserver', ----------------------------- Typescript / JavaScript 'vuels', -------------------------------- Vue 'svelte', ------------------------------- Svelte ['yamlls'] = { -------------------------- YAML ['settings'] = { ['yaml'] = { ['schemas'] = { ['https://json.schemastore.org/github-workflow'] = '.github/workflows/*.{yml,yaml}', ['https://json.schemastore.org/github-action'] = '.github/action.{yml,yaml}', ['https://json.schemastore.org/ansible-stable-2.9'] = 'roles/tasks/*.{yml,yaml}', ['https://json.schemastore.org/drone'] = '*.drone.{yml,yaml}', ['https://json.schemastore.org/swagger-2.0'] = 'swagger.{yml,yaml}', } } } } }) do -- Setup all of the language servers. † if type(lsp_key) == 'number' then -- Enable the LSP with defaults. -- The `lsp` is an index in this case. nvim_lsp[lsp_settings].setup{['on_attach'] = lsp_setup} else -- Use the LSP's configuration. local on_attach_setting = on_attach lsp_settings.on_attach = function() if on_attach_setting then on_attach_setting() end end nvim_lsp[lsp_key].setup(lsp_settings) end end -- ‡ EOF " Visualize diagnostics let g:diagnostic_enable_virtual_text = 1 let g:diagnostic_trimmed_virtual_text = '40' " Don't show diagnostics while in insert mode let g:diagnostic_insert_delay = 1 " Show diagnostic popup on cursor hold autocmd CursorHold * lua vim.lsp.diagnostic.show_line_diagnostics() " Goto previous/next diagnostic warning/error " nnoremap g[ PrevDiagnosticCycle " nnoremap g] NextDiagnosticCycle " have a fixed column for the diagnostics to appear in " this removes the jitter when warnings/errors flow in set signcolumn=yes " NeoVim 0.5 Code navigation shortcuts nnoremap gd lua vim.lsp.buf.definition() nnoremap K lua vim.lsp.buf.hover() nnoremap gD lua vim.lsp.buf.implementation() nnoremap lua vim.lsp.buf.signature_help() nnoremap 1gD lua vim.lsp.buf.type_definition() nnoremap gr lua vim.lsp.buf.references() nnoremap g0 lua vim.lsp.buf.document_symbol() nnoremap gW lua vim.lsp.buf.workspace_symbol() nnoremap lua vim.lsp.buf.declaration()