diff --git a/.config/nvim/lua/plugins/lsp.lua b/.config/nvim/lua/plugins/lsp.lua index 8bd8a30..dc5be5d 100644 --- a/.config/nvim/lua/plugins/lsp.lua +++ b/.config/nvim/lua/plugins/lsp.lua @@ -1,78 +1,68 @@ -- nvim-lspconfig, https://github.com/neovim/nvim-lspconfig --- Set LSP keymappings in on_attach (i.e. only in buffers with LSP active) --- TODO: lspconfig recommend doing this in an LspAttach autocommand instead -local on_attach = function(client, bufnr) - local opts = { buffer = bufnr, silent = true } - vim.keymap.set("n", "K", vim.lsp.buf.hover, opts) - vim.keymap.set("n", "gd", vim.lsp.buf.definition, opts) - vim.keymap.set("n", "lrn", vim.lsp.buf.rename, opts) - vim.keymap.set("n", "lrr", vim.lsp.buf.references, opts) - vim.keymap.set("n", "lca", function() vim.lsp.buf.code_action({apply = true}) end, opts) - vim.keymap.set("n", "lqf", function() vim.lsp.buf.code_action({apply = true}) end, opts) - vim.keymap.set("i", "", vim.lsp.buf.signature_help, opts) - vim.keymap.set("v", "lfmt", function() vim.lsp.buf.format({timeout_ms = 1000000}) end, opts) -end - --- Setup lspconfig: capabilities is passed to lspconfig.$server.setup --- TODO: Why don't I have to make_client_capabilities and extend? -local capabilities = require("cmp_nvim_lsp").default_capabilities() +-- Note: The server configuration in this file is done in the +-- nvim-lspconfig.config() setup function. This is a bit strange but at least +-- it ensures the config is run *after* configuring the plugin... -local default_opts = { - on_attach = on_attach, - capabilities = capabilities, -} +-- TODO: Unclear whether this is needed or not. Completions seem to work anyway? +-- local capabilities = require("cmp_nvim_lsp").default_capabilities() -local servers = { - -- Rust LSP (rust_analyzer) - rust_analyzer = default_opts, - -- C/C++ LSP (clangd) - clangd = default_opts, - -- Go LSP (gopls) - gopls = default_opts, - -- YAML LSP (yaml-language-server) - yamlls = default_opts, - -- Ansible LSP (ansible-language-server) - ansiblels = default_opts, - -- Terraform LSP (terraform-ls) - terraformls = default_opts, +local function config() + -- Configure an autocommand which fires when a server attaches to a buffer + vim.api.nvim_create_autocmd('LspAttach', { + callback = function(args) + local opts = { buffer = args.buf, silent = true } + vim.keymap.set("n", "K", vim.lsp.buf.hover, opts) + vim.keymap.set("n", "gd", vim.lsp.buf.definition, opts) + vim.keymap.set("n", "lrn", vim.lsp.buf.rename, opts) + vim.keymap.set("n", "lrr", vim.lsp.buf.references, opts) + vim.keymap.set("n", "lca", function() vim.lsp.buf.code_action({apply = true}) end, opts) + vim.keymap.set("n", "lqf", function() vim.lsp.buf.code_action({apply = true}) end, opts) + vim.keymap.set("i", "", vim.lsp.buf.signature_help, opts) + vim.keymap.set("v", "lfmt", function() vim.lsp.buf.format({timeout_ms = 1000000}) end, opts) + end, + }) -- Julia LSP (LanguageServer.jl) - julials = vim.tbl_extend( - "force", - default_opts, - { - on_new_config = function(new_config, _) - local julia = vim.fn.expand("~/.julia/environments/nvim-lspconfig/bin/julia") - local REVISE_LANGUAGESERVER = false - if REVISE_LANGUAGESERVER then - new_config.cmd[5] = (new_config.cmd[5]):gsub("using LanguageServer", "using Revise; using LanguageServer; LanguageServer.USE_REVISE[] = true") - elseif require("lspconfig").util.path.is_file(julia) then - new_config.cmd[1] = julia - end - end, - -- This just adds dirname(fname) as a fallback (see nvim-lspconfig#1768). - root_dir = function(fname) - local util = require("lspconfig.util") - return util.root_pattern "Project.toml"(fname) or util.find_git_ancestor(fname) or - util.path.dirname(fname) - end, + do + -- Modify the julia binary to out custom built one if it exists + local cfg = vim.lsp.config.julials + local cmd = cfg.cmd + local julia = vim.fn.expand("~/.julia/environments/nvim-lspconfig/bin/julia") + local REVISE_LANGUAGESERVER = false + if REVISE_LANGUAGESERVER then + cmd[5] = (cmd[5]):gsub("using LanguageServer", "using Revise; using LanguageServer; LanguageServer.USE_REVISE[] = true") + elseif require("lspconfig").util.path.is_file(julia) then + cmd[1] = julia + end + vim.lsp.config('julials', { + cmd = cmd, on_attach = function(client, bufnr) - on_attach(client, bufnr) - -- Disable automatic formatexpr since the LS.jl formatter isn't so nice. + -- Disable automatic formatexpr since the LS.jl formatter isn't very nice. vim.bo[bufnr].formatexpr = "" end, - } - ), -} - -local function configure_lsp() - lspconfig = require("lspconfig") - for name, opts in pairs(servers) do - lspconfig[name].setup(opts) + -- -- This just adds dirname(fname) as a fallback (see nvim-lspconfig#1768). + -- root_dir = function(fname) + -- local util = require("lspconfig.util") + -- return util.root_pattern "Project.toml"(fname) or util.find_git_ancestor(fname) or + -- util.path.dirname(fname) + -- end, + }) + vim.lsp.enable("julials") end + -- Enable some more servers. These don't need special handling, yey! + vim.lsp.enable({ + "ansiblels", -- Ansible LSP (ansible-language-server) + "clangd", -- C/C++ LSP (clangd) + "clangd", -- C/C++ LSP (clangd) + "gopls", -- Go LSP (gopls) + "pylsp", -- Python LSP (python-lsp-server) + "rust_analyzer", -- Rust LSP (rust_analyzer) + "terraformls", -- Terraform LSP (terraform-ls) + "yamlls", -- YAML LSP (yaml-language-server) + }) end return { "neovim/nvim-lspconfig", - config = configure_lsp, + config = config, }