lsp.lua

Branches > main > ee9bf10 > files / nvim / lua / lsp.lua

local lsp = vim.lsp
local keymap = vim.keymap.set

local function references()
  lsp.buf.references({includeDeclaration = false}, {on_list = function(list)
    table.sort(list.items, function(a, b)
      if a.filename ~= b.filename then return a.filename < b.filename end
      if a.lnum ~= b.lnum then return a.lnum < b.lnum end
      return a.col < b.col
    end)
    vim.fn.setqflist({}, " ", list)
    vim.cmd("botright copen")
  end})
end

local function on_attach(client, bufnr)
  keymap("n", "gd", lsp.buf.definition, {buffer = bufnr})
  keymap("n", "gr", references, {buffer = bufnr, nowait = true})
  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", ".project", "gradlew.bat", "gradle"}})

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"}})

local java_home = vim.fn.fnamemodify(vim.fn.resolve(vim.fn.exepath("java")), ":h:h")

config({name = "jdtls",
        filetypes = {"java"},
        settings = {java = {configuration = {runtimes = {{name = "JavaSE-25",
                                                          path = java_home,
                                                          default = true}}}}},
        root_markers = {"mvnw",
                        "gradlew",
                        "settings.gradle",
                        "settings.gradle.kts",
                        ".git",
                        "build.xml",
                        "pom.xml",
                        "build.gradle",
                        "build.gradle.kts"}})