local capabilities = vim.lsp.protocol.make_client_capabilities() capabilities = require('cmp_nvim_lsp').update_capabilities(capabilities) local lsp_installer = require "nvim-lsp-installer" -- Mappings. -- See `:help vim.diagnostic.*` for documentation on any of the below functions local keyOpts = { noremap = true, silent = true } vim.api.nvim_set_keymap('n', 'e', 'lua vim.diagnostic.open_float()', keyOpts) vim.api.nvim_set_keymap('n', '[d', 'lua vim.diagnostic.goto_prev()', keyOpts) vim.api.nvim_set_keymap('n', ']d', 'lua vim.diagnostic.goto_next()', keyOpts) vim.api.nvim_set_keymap('n', 'q', 'lua vim.diagnostic.setloclist()', keyOpts) -- Use an on_attach function 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 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 vim.api.nvim_buf_set_keymap(bufnr, 'n', 'gD', 'lua vim.lsp.buf.declaration()', keyOpts) vim.api.nvim_buf_set_keymap(bufnr, 'n', '', 'lua vim.lsp.buf.definition()', keyOpts) vim.api.nvim_buf_set_keymap(bufnr, 'n', 'K', 'lua vim.lsp.buf.hover()', keyOpts) vim.api.nvim_buf_set_keymap(bufnr, 'n', 'gi', 'lua vim.lsp.buf.implementation()', keyOpts) vim.api.nvim_buf_set_keymap(bufnr, 'n', '', 'lua vim.lsp.buf.signature_help()', keyOpts) vim.api.nvim_buf_set_keymap(bufnr, 'n', 'wa', 'lua vim.lsp.buf.add_workspace_folder()', keyOpts) vim.api.nvim_buf_set_keymap(bufnr, 'n', 'wr', 'lua vim.lsp.buf.remove_workspace_folder()', keyOpts) vim.api.nvim_buf_set_keymap(bufnr, 'n', 'wl', 'lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))', keyOpts) vim.api.nvim_buf_set_keymap(bufnr, 'n', 'D', 'lua vim.lsp.buf.type_definition()', keyOpts) vim.api.nvim_buf_set_keymap(bufnr, 'n', 'rn', 'lua vim.lsp.buf.rename()', keyOpts) vim.api.nvim_buf_set_keymap(bufnr, 'n', 'ca', 'lua vim.lsp.buf.code_action()', keyOpts) vim.api.nvim_buf_set_keymap(bufnr, 'n', 'gr', 'lua vim.lsp.buf.references()', keyOpts) vim.api.nvim_buf_set_keymap(bufnr, 'n', 'f', 'lua vim.lsp.buf.formatting()', keyOpts) end -- 安装列表 -- https://github.com/williamboman/nvim-lsp-installer#available-lsps -- { key: 语言 value: 配置文件 } local servers = { sumneko_lua = require "lsp.base", -- /lua/lsp/lua.lua gopls = require "lsp.base", volar = require "lsp.base" } -- 自动安装 LanguageServers for name, _ in pairs(servers) do local server_is_found, server = lsp_installer.get_server(name) if server_is_found then if not server:is_installed() then print("Installing " .. name) server:install() end end end lsp_installer.on_server_ready(function(server) local opts = servers[server.name] opts.on_attach = on_attach opts.capabilities = capabilities opts.flags = { debounce_text_changes = 150, } server:setup(opts) end) -- luasnip setup local luasnip = require 'luasnip' local cmp_autopairs = require('nvim-autopairs.completion.cmp') require('nvim-ts-autotag').setup() -- nvim-cmp setup local cmp = require 'cmp' cmp.event:on( 'confirm_done', cmp_autopairs.on_confirm_done({ map_char = { tex = '' } })) cmp.setup { snippet = { expand = function(args) luasnip.lsp_expand(args.body) end, }, mapping = cmp.mapping.preset.insert({ [''] = cmp.mapping.scroll_docs(-4), [''] = cmp.mapping.scroll_docs(4), [''] = cmp.mapping.complete(), [''] = cmp.mapping.confirm { behavior = cmp.ConfirmBehavior.Replace, select = true, }, [''] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_next_item() elseif luasnip.expand_or_jumpable() then luasnip.expand_or_jump() else fallback() end end, { 'i', 's' }), [''] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_prev_item() elseif luasnip.jumpable(-1) then luasnip.jump(-1) else fallback() end end, { 'i', 's' }), }), sources = { { name = 'nvim_lsp' }, { name = 'luasnip' }, { name = 'buffer' }, { name = 'path' } }, }