local on_attach = function(client, bufnr) local function buf_set_keymap(...) vim.api.nvim_buf_set_keymap(bufnr, ...) end local function buf_set_option(...) vim.api.nvim_buf_set_option(bufnr, ...) end buf_set_option('omnifunc', 'v:lua.vim.lsp.omnifunc') -- Mappings. local opts = { noremap=true, silent=true } 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', '', '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', 'gr', 'lua vim.lsp.buf.references()', opts) buf_set_keymap('n', 'e', 'lua vim.lsp.diagnostic.show_line_diagnostics({focusable=false})', opts) buf_set_keymap('n', '[d', 'lua vim.lsp.diagnostic.goto_prev()', opts) buf_set_keymap('n', ']d', 'lua vim.lsp.diagnostic.goto_next()', opts) buf_set_keymap('n', 'q', 'lua vim.lsp.diagnostic.set_loclist()', opts) -- Show diagnostic automatically when cursor is on hold. vim.api.nvim_command('autocmd CursorHold lua vim.lsp.diagnostic.show_line_diagnostics({focusable=false})') -- Set some keybinds conditional on server capabilities if client.resolved_capabilities.document_formatting then buf_set_keymap("n", "f", "lua vim.lsp.buf.formatting()", opts) end if client.resolved_capabilities.document_range_formatting then buf_set_keymap("x", "f", "lua vim.lsp.buf.range_formatting()", opts) end -- Set autocommands conditional on server_capabilities if client.resolved_capabilities.document_highlight then vim.api.nvim_exec([[ hi link LspReferenceRead Visual hi link LspReferenceText Visual hi link LspReferenceWrite Visual augroup lsp_document_highlight autocmd! * autocmd CursorHold lua vim.lsp.buf.document_highlight() autocmd CursorMoved lua vim.lsp.buf.clear_references() augroup END ]], false) end local msg = string.format('Language server %s started!' , client.name) vim.api.nvim_echo({{msg, 'MoreMsg'}, }, false, {}) end local lspconfig = require("lspconfig") lspconfig.pyls.setup { on_attach = on_attach, settings = { pyls = { plugins = { flake8 = {enabled = false}, pylint = {enabled = true, executable = "pylint"}, pyflakes = {enabled = false}, pycodestyle = {enabled = false}, jedi_completion = {fuzzy = true}, pyls_isort = {enabled = true}, pyls_mypy = {enabled = true} } } } } -- set up ccls, see https://github.com/neovim/nvim-lspconfig/blob/master/CONFIG.md#ccls if vim.fn.executable('ccls') then lspconfig.ccls.setup { on_attach = on_attach, root_dir = lspconfig.util.root_pattern("compile_commands.json", ".ccls", ".git"), init_options = { highlight = { lsRanges = true } } } end -- set up vim-language-server lspconfig.vimls.setup{ on_attach = on_attach } -- Change diagnostic signs. vim.fn.sign_define('LspDiagnosticsSignError', { text = "✗", texthl = "LspDiagnosticsDefaultError" }) vim.fn.sign_define('LspDiagnosticsSignWarning', { text = "!", texthl = "LspDiagnosticsDefaultWarning" }) vim.fn.sign_define('LspDiagnosticsSignInformation', { text = "", texthl = "LspDiagnosticsDefaultInformation" }) vim.fn.sign_define('LspDiagnosticsSignHint', { text = "", texthl = "LspDiagnosticsDefaultHint" }) vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with( vim.lsp.diagnostic.on_publish_diagnostics, { underline = false, virtual_text = false, signs = true, update_in_insert = false, } ) -- The following settings works with the bleeding edge neovim. -- See https://github.com/neovim/neovim/pull/13998. vim.lsp.handlers["textDocument/hover"] = vim.lsp.with( vim.lsp.handlers.hover, { border = { {"┌", "Normal"}, {"─", "Normal"}, {"┐", "Normal"}, {"│", "Normal"}, {"┘", "Normal"}, {"─", "Normal"}, {"└", "Normal"}, {"│", "Normal"} } } ) -- nvim-compe settings require'compe'.setup { enabled = true; autocomplete = true; debug = false; min_length = 1; preselect = 'always'; throttle_time = 80; source_timeout = 200; incomplete_delay = 400; max_abbr_width = 100; max_kind_width = 100; max_menu_width = 100; documentation = true; source = { omni = {filetypes = {'tex'}}; path = true; buffer = false; spell = {filetypes = {'markdown', 'tex'}}; emoji = true; nvim_lsp = true; nvim_lua = true; ultisnips = true; calc = false; vsnip = false; }; } vim.o.completeopt = "menuone,noselect" -- nvim-comple mappings vim.api.nvim_set_keymap('i', '', 'compe#complete()', {expr = true}) vim.api.nvim_set_keymap('i', '', "compe#confirm('')", {expr = true}) vim.api.nvim_set_keymap('i', '', "compe#close('')", {expr = true}) vim.api.nvim_set_keymap('i', '', "compe#scroll({'delta': +4})", {expr = true}) vim.api.nvim_set_keymap('i', '', "compe#scroll({'delta': -4})", {expr = true})