summaryrefslogtreecommitdiff
path: root/lua/lsp.lua
diff options
context:
space:
mode:
authorJosh Rahm <rahm@google.com>2023-01-18 00:26:21 +0000
committerJosh Rahm <rahm@google.com>2023-01-18 00:26:21 +0000
commitf4ef7d4b7ff00f0a086ef23378ce3ca4cc7b8313 (patch)
treed3ba16688ae3ddfef971fc1c9934f18cc84d703b /lua/lsp.lua
parentcabff8615ed4784c52d4c421536020c8a44d970d (diff)
downloadconfig.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.lua208
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]]