local on_attach = function(client) vim.wo.signcolumn = 'yes' local maps = { { 'n', '', 'lua vim.lsp.buf.definition()' }, { 'n', 'K', 'lua vim.lsp.buf.hover()' }, { 'n', 'gD', 'lua vim.lsp.buf.implementation()' }, { 'n', '1gD', 'lua vim.lsp.buf.type_definition()' }, { 'n', 'gW', 'lua vim.lsp.buf.workspace_symbol()' }, { 'n', 'gd', 'lua vim.lsp.buf.declaration()' }, { 'n', 'ga', 'lua vim.lsp.buf.code_action()' }, { 'n', 'f', 'lua vim.lsp.buf.format({ async = true })' }, { 'n', 'r', 'lua vim.lsp.buf.rename()' }, { 'n', 'gl', 'lua vim.lsp.buf.document_highlight()' }, { 'n', 'gm', 'lua vim.diagnostic.open_float()' }, -- { 'n', 'g0', 'Denite lsp/document_symbol -auto-action=highlight' }, { 'n', 'gr', 'Denite lsp/references -auto-action=preview_bat' }, } for _, map in ipairs(maps) do vim.api.nvim_buf_set_keymap(0, map[1], map[2], map[3], { noremap = true }) end vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with( vim.lsp.diagnostic.on_publish_diagnostics, { virtual_text = false, severity_sort = true, } ) -- require "lsp_signature".on_attach({ -- floating_window = false, -- }) -- Note: add in lsp client on-attach local forceCompletionPattern = "\\.|:\\s*|->" if client.server_capabilities.completionProvider ~= nil then local triggers = client.server_capabilities.completionProvider.triggerCharacters local escaped = {} if triggers and #triggers > 0 then -- convert lsp triggerCharacters to js regexp for _, c in pairs(triggers) do local ch_list = { '[', '\\', '^', '$', '.', '|', '?', '*', '+', '(', ')' } if vim.tbl_contains(ch_list, c) then table.insert(escaped, '\\' .. c) else table.insert(escaped, c) end end forceCompletionPattern = table.concat(escaped, '|') end end -- add nvim-lsp source for ddc.vim -- override ddc setting of lsp buffer vim.fn['ddc#custom#patch_buffer']({ sourceOptions = { ["nvim-lsp"] = { minAutoCompleteLength = 1, forceCompletionPattern = forceCompletionPattern, } }, }) end require("neodev").setup() -- The nvim-cmp almost supports LSP's capabilities so You should advertise it to LSP servers.. local capabilities = vim.lsp.protocol.make_client_capabilities() capabilities.textDocument.completion.completionItem.preselectSupport = false capabilities.textDocument.completion.completionItem.insertReplaceSupport = false capabilities.textDocument.completion.completionItem.labelDetailsSupport = false capabilities.textDocument.completion.completionItem.snippetSupport = true capabilities.textDocument.completion.completionItem.deprecatedSupport = false capabilities.textDocument.completion.completionItem.commitCharactersSupport = false -- capabilities.textDocument.completion.completionItem.tagSupport = { valueSet = { 1 } } capabilities.textDocument.completion.completionItem.resolveSupport = { properties = { 'documentation', 'detail', -- 'additionalTextEdits', } } local nvim_lsp = require('lspconfig') local node_root_dir = nvim_lsp.util.root_pattern("package.json", "node_modules") local buf_name = vim.api.nvim_buf_get_name(0) local current_buf = vim.api.nvim_get_current_buf() local is_node_repo = node_root_dir(buf_name, current_buf) ~= nil nvim_lsp.clangd.setup { on_attach = on_attach, capabilities = capabilities, cmd = { "clangd", "--offset-encoding=utf-16", }, } nvim_lsp.gopls.setup { on_attach = on_attach, capabilities = capabilities } nvim_lsp.vimls.setup { on_attach = on_attach, capabilities = capabilities } nvim_lsp.pyright.setup { on_attach = on_attach, capabilities = capabilities } nvim_lsp.julials.setup { on_attach = on_attach, capabilities = capabilities } nvim_lsp.bashls.setup { on_attach = on_attach, capabilities = capabilities } nvim_lsp.svlangserver.setup { on_attach = on_attach, capabilities = capabilities, settings = { systemverilog = { launchConfiguration = "verilator -sv -Wall --lint-only pkg_def.sv", } } } nvim_lsp.svls.setup { on_attach = on_attach, capabilities = capabilities } nvim_lsp.texlab.setup { on_attach = on_attach, capabilities = capabilities, root_dir = nvim_lsp.util.root_pattern('main.tex'), settings = { texlab = { rootDirectory = ".", } } } nvim_lsp.zls.setup { on_attach = on_attach, capabilities = capabilities, cmd = { vim.fn.expand('$HOME/ghq/github.com/zigtools/zls/zig-out/bin/zls') }, } nvim_lsp.denols.setup { on_attach = on_attach, capabilities = capabilities, init_options = { lint = true, unstable = true, }, autostart = not (is_node_repo), } nvim_lsp.lua_ls.setup { on_attach = on_attach, capabilities = capabilities, settings = { Lua = { runtime = { version = 'LuaJIT', path = vim.split(package.path, ';'), }, diagnostics = { globals = { 'vim' }, }, workspace = { library = { [vim.fn.expand('$VIMRUNTIME/lua')] = true, [vim.fn.expand('$VIMRUNTIME/lua/vim/lsp')] = true, }, }, }, } } nvim_lsp.rust_analyzer.setup { on_attach = on_attach, capabilities = capabilities } nvim_lsp.tsserver.setup { on_attach = on_attach, capabilities = capabilities, autostart = is_node_repo, }