lsp.lua
Branches > main > 7e90c32 > files / nvim / lua / lsp.lua
local lsp = vim.lsp
local keymap = vim.keymap.set
local function on_attach(client, bufnr)
keymap("n", "gd", lsp.buf.definition, {buffer = bufnr})
keymap("n", "gr", lsp.buf.references, {buffer = bufnr})
keymap("n", "gi", lsp.buf.implementation, {buffer = bufnr})
keymap("n", "<Space>r", lsp.buf.rename, {buffer = bufnr})
keymap("n", "<Space>c", lsp.buf.code_action, {buffer = bufnr})
end
local function config(opts)
local name = opts.name
--- Skip servers that aren't installed, otherwise every buffer logs an error
if vim.fn.executable(name) == 0 then return end
opts.cmd = {name}
opts.on_attach = on_attach
lsp.config(name, opts)
lsp.enable(name)
end
local clojure_root_markers = {"project.clj", "deps.edn", "build.boot", "shadow-cljs.edn", ".git", "bb.edn"}
config({name = "clojure-lsp",
filetypes = {"clojure"},
--- gd into a library opens a zipfile:// buffer, reuse the project's client
--- for it instead of starting a new one with no root (which errors)
root_dir = function(bufnr, on_dir)
if vim.api.nvim_buf_get_name(bufnr):match("^zipfile:") then
local client = lsp.get_clients({name = "clojure-lsp"})[1]
if client then on_dir(client.root_dir) end
return
end
on_dir(vim.fs.root(bufnr, clojure_root_markers))
end})
config({name = "kotlin-language-server",
filetypes = {"kotlin"},
root_markers = {"build.gradle.kts", "gradlew", ".git"}})
config({name = "lua-language-server",
filetypes = {"lua"},
--- Its formatter fights my style, so don't format lua on write
settings = {Lua = {diagnostics = {globals = {"vim"}}, format = {enable = false}}},
root_markers = {".luarc.json", ".luarc.jsonc", ".luacheckrc", ".stylua.toml", "stylua.toml", "selene.toml", "selene.yml", ".git"}})
config({name = "jdtls",
filetypes = {"java"},
root_markers = {"mvnw",
"gradlew",
"settings.gradle",
"settings.gradle.kts",
".git",
"build.xml",
"pom.xml",
"build.gradle",
"build.gradle.kts"}})