-- CiderLSP local vim = assert(vim) -- 1. Configure CiderLSP -- Set desired filetypes from go/ciderlsp#supported -- To list all filetype names, see https://vi.stackexchange.com/a/14990 local nvim_lsp = require("lspconfig") local configs = require("lspconfig.configs") configs.ciderlsp = { default_config = { cmd = { "/google/bin/releases/cider/ciderlsp/ciderlsp", "-merge_diagnostic_layers=true", "-tooltag=nvim-cmp" }, filetypes = { "java", "kotlin", "objc", "proto", "textproto", "go", "python", "BUILD" }, root_dir = nvim_lsp.util.root_pattern("BUILD"), settings = {}, }, } configs.lualsp = { default_config = { cmd = { "/usr/local/google/home/rahm/Projects/lua-language-server/bin/lua-language-server" }, filetypes = { "lua" }, settings = {}, root_dir = nvim_lsp.util.root_pattern(""), }, } configs.clangd = { default_config = { cmd = { "clangd" }, filetypes = { "c", "cpp" }, settings = {}, root_dir = nvim_lsp.util.root_pattern(""), }, } configs.hls = { default_config = { cmd = { "haskell-language-server-wrapper", "--lsp" }, filetypes = { "haskell" }, settings = {}, root_dir = nvim_lsp.util.root_pattern("package.yaml"), } } local has_words_before = function() unpack = unpack or table.unpack local line, col = unpack(vim.api.nvim_win_get_cursor(0)) return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match("%s") == nil end local feedkey = function(key, mode) vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes(key, true, true, true), mode, true) end -- 2. Configure CMP vim.opt.completeopt = { "menu", "menuone", "noselect" } -- Don't show matching vim.opt.shortmess:append("c") local lspkind = require("lspkind") lspkind.init() local cmp = require("cmp") cmp.setup({ mapping = { [""] = cmp.mapping.scroll_docs(-4), [""] = cmp.mapping.scroll_docs(4), [""] = cmp.mapping.close(), [""] = cmp.mapping(cmp.mapping.complete(), { "i", "c" }), [""] = cmp.mapping.confirm({ select = true }), [""] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_next_item() else fallback() -- The fallback function sends a already mapped key. In this case, it's probably ``. end end, { "i", "s" }), [""] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_prev_item() else fallback() -- The fallback function sends a already mapped key. In this case, it's probably ``. end end, { "i", "s" }), [""] = cmp.mapping(function(fallback) if cmp.visible() then cmp.mapping.confirm({ select = true }) elseif vim.fn["vsnip#available"](1) == 1 then feedkey("(vsnip-expand-or-jump)", "") elseif has_words_before() then cmp.complete() else fallback() -- The fallback function sends a already mapped key. In this case, it's probably ``. end end, { "i", "s" }), [""] = cmp.mapping(function() if cmp.visible() then cmp.select_prev_item() elseif vim.fn["vsnip#jumpable"](-1) == 1 then feedkey("(vsnip-jump-prev)", "") end end, { "i", "s" }), }, sources = { { name = "nvim_lsp" }, { name = "path" }, { name = "vim_vsnip" }, { name = "buffer", keyword_length = 5 }, }, sorting = { comparators = {}, -- We stop all sorting to let the lsp do the sorting }, snippet = { expand = function(args) vim.fn["vsnip#anonymous"](args.body) end, }, formatting = { format = lspkind.cmp_format({ with_text = true, maxwidth = 40, -- half max width menu = { buffer = "[buffer]", nvim_lsp = "[LSP]", nvim_lua = "[API]", path = "[path]", vim_vsnip = "[snip]", }, }), }, experimental = { native_menu = false, ghost_text = true, }, }) vim.cmd([[ augroup CmpZsh au! autocmd Filetype zsh lua require'cmp'.setup.buffer { sources = { { name = "zsh" }, } } augroup END ]]) -- 3. Set up CiderLSP local on_attach = function(client, bufnr) vim.api.nvim_buf_set_option(bufnr, "omnifunc", "v:lua.vim.lsp.omnifunc") if vim.lsp.formatexpr then -- Neovim v0.6.0+ only. vim.api.nvim_buf_set_option(bufnr, "formatexpr", "v:lua.vim.lsp.formatexpr") end if vim.lsp.tagfunc then vim.api.nvim_buf_set_option(bufnr, "tagfunc", "v:lua.vim.lsp.tagfunc") end local opts = { noremap = true, silent = true } vim.api.nvim_buf_set_keymap(bufnr, "n", "rn", "lua vim.lsp.buf.rename()", opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "ca", "lua vim.lsp.buf.code_action()", opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "", "lua vim.lsp.buf.hover()", opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "g0", "lua vim.lsp.buf.document_symbol()", opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "gW", "lua vim.lsp.buf.workspace_symbol()", opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "gd", "lua vim.lsp.buf.definition()", opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "gD", "lua vim.lsp.buf.declaration()", opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "gi", "lua vim.lsp.buf.implementation()", opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "gr", "lua vim.lsp.buf.references()", opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "", "lua vim.lsp.buf.signature_help()", opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "gt", "lua vim.lsp.buf.type_definition()", opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "[d", "lua vim.diagnostic.goto_prev()", opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "]d", "lua vim.diagnostic.goto_next()", opts) vim.api.nvim_command("augroup LSP") vim.api.nvim_command("autocmd!") if client.server_capabilities.documentHighlightProvider then vim.api.nvim_command("autocmd CursorHold lua vim.lsp.buf.document_highlight()") vim.api.nvim_command("autocmd CursorHoldI lua vim.lsp.buf.document_highlight()") vim.api.nvim_command("autocmd CursorMoved lua vim.lsp.util.buf_clear_references()") end vim.api.nvim_command("augroup END") end nvim_lsp.ciderlsp.setup({ capabilities = require("cmp_nvim_lsp").default_capabilities(vim.lsp.protocol.make_client_capabilities()), on_attach = on_attach, }) nvim_lsp.lualsp.setup({ capabilities = require("cmp_nvim_lsp").default_capabilities(vim.lsp.protocol.make_client_capabilities()), on_attach = on_attach, }) nvim_lsp.clangd.setup({ capabilities = require("cmp_nvim_lsp").default_capabilities(vim.lsp.protocol.make_client_capabilities()), on_attach = on_attach, }) nvim_lsp.hls.setup({ capabilities = require("cmp_nvim_lsp").default_capabilities(vim.lsp.protocol.make_client_capabilities()), on_attach = on_attach, }) vim.cmd[[hi DiagnosticUnderlineError gui=undercurl guisp=salmon]] vim.cmd[[hi DiagnosticUnderlineWarn gui=undercurl guisp=gold]]