diff options
author | Josh Rahm <rahm@google.com> | 2023-01-18 00:26:21 +0000 |
---|---|---|
committer | Josh Rahm <rahm@google.com> | 2023-01-18 00:26:21 +0000 |
commit | f4ef7d4b7ff00f0a086ef23378ce3ca4cc7b8313 (patch) | |
tree | d3ba16688ae3ddfef971fc1c9934f18cc84d703b /lua/lsp.lua | |
parent | cabff8615ed4784c52d4c421536020c8a44d970d (diff) | |
download | config.vim-f4ef7d4b7ff00f0a086ef23378ce3ca4cc7b8313.tar.gz config.vim-f4ef7d4b7ff00f0a086ef23378ce3ca4cc7b8313.tar.bz2 config.vim-f4ef7d4b7ff00f0a086ef23378ce3ca4cc7b8313.zip |
add lua files
Diffstat (limited to 'lua/lsp.lua')
-rw-r--r-- | lua/lsp.lua | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/lua/lsp.lua b/lua/lsp.lua new file mode 100644 index 0000000..ac086e4 --- /dev/null +++ b/lua/lsp.lua @@ -0,0 +1,208 @@ +-- 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 = { + ["<C-d>"] = cmp.mapping.scroll_docs(-4), + ["<C-u>"] = cmp.mapping.scroll_docs(4), + ["<C-e>"] = cmp.mapping.close(), + ["<C-Space>"] = cmp.mapping(cmp.mapping.complete(), { "i", "c" }), + ["<C-m>"] = cmp.mapping.confirm({ select = true }), + ["<C-n>"] = 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 `<Tab>`. + end + end, { "i", "s" }), + ["<C-p>"] = 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 `<Tab>`. + end + end, { "i", "s" }), + + ["<Tab>"] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.mapping.confirm({ select = true }) + elseif vim.fn["vsnip#available"](1) == 1 then + feedkey("<Plug>(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 `<Tab>`. + end + end, { "i", "s" }), + + ["<S-Tab>"] = cmp.mapping(function() + if cmp.visible() then + cmp.select_prev_item() + elseif vim.fn["vsnip#jumpable"](-1) == 1 then + feedkey("<Plug>(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", "<leader>rn", "<cmd>lua vim.lsp.buf.rename()<CR>", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>ca", "<cmd>lua vim.lsp.buf.code_action()<CR>", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "<M-k>", "<cmd>lua vim.lsp.buf.hover()<CR>", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "g0", "<cmd>lua vim.lsp.buf.document_symbol()<CR>", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "gW", "<cmd>lua vim.lsp.buf.workspace_symbol()<CR>", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "gd", "<cmd>lua vim.lsp.buf.definition()<CR>", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "gD", "<cmd>lua vim.lsp.buf.declaration()<CR>", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "gi", "<cmd>lua vim.lsp.buf.implementation()<CR>", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "gr", "<cmd>lua vim.lsp.buf.references()<CR>", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "<C-k>", "<cmd>lua vim.lsp.buf.signature_help()<CR>", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "gt", "<cmd>lua vim.lsp.buf.type_definition()<CR>", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "[d", "<cmd>lua vim.diagnostic.goto_prev()<CR>", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "]d", "<cmd>lua vim.diagnostic.goto_next()<CR>", opts) + + vim.api.nvim_command("augroup LSP") + vim.api.nvim_command("autocmd!") + if client.server_capabilities.documentHighlightProvider then + vim.api.nvim_command("autocmd CursorHold <buffer> lua vim.lsp.buf.document_highlight()") + vim.api.nvim_command("autocmd CursorHoldI <buffer> lua vim.lsp.buf.document_highlight()") + vim.api.nvim_command("autocmd CursorMoved <buffer> 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]] |