aboutsummaryrefslogtreecommitdiffstats
path: root/lua/pi/lsp/default.lua
blob: 1f4dfb0647c93bf030ac78b04141057b7f704919 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
-- Helper function to find root directory patterns
local function root_pattern(...)
  local patterns = { ... }
  return function(fname)
    for _, pattern in ipairs(patterns) do
      local found = vim.fs.find(pattern, {
        path = fname,
        upward = true,
      })[1]
      if found then
        return vim.fs.dirname(found)
      end
    end
  end
end

-- Server command configurations
local server_commands = {
  emmet_ls = { "emmet-ls", "--stdio" },
  gopls = { "gopls" },
  html = { "vscode-html-language-server", "--stdio" },
  jsonls = { "vscode-json-language-server", "--stdio" },
  lua_ls = { "lua-language-server" },
  phpactor = { "phpactor", "language-server" },
  svelte = { "svelteserver", "--stdio" },
  tailwindcss = { "tailwindcss-language-server", "--stdio" },
  ts_ls = { "typescript-language-server", "--stdio" },
  volar = { "vue-language-server", "--stdio" },
  texlab = { "texlab" },
  pyright = { "pyright-langserver", "--stdio" },
  kotlin_language_server = { "kotlin-language-server" },
  smarty_ls = { "smarty-language-server", "--stdio" },
  clangd = { "clangd" },
  asm_lsp = { "asm-lsp" },
}

return {
  get_server_cmd = function(server)
    return server_commands[server] or { server }
  end,
  get_default_root_dir = function()
    return root_pattern(".git", "package.json", "Cargo.toml", "composer.json")(vim.api.nvim_buf_get_name(0))
  end,
  servers = {
    emmet_ls = { enable = true },
    gopls = { enable = true },
    html = { enable = true },
    jsonls = { enable = true },
    lua_ls = { enable = true, neodev = true },
    -- nil_ls = { enable = true },
    phpactor = { enable = true },
    -- rust_analyzer = { enable = true },
    svelte = { enable = true },
    tailwindcss = { enable = true, filetypes = { "blade", "html", "svelte" } },
    ts_ls = { enable = true },
    volar = { enable = true },
    texlab = { enable = true, filetypes = { "tex", "bib" } },
    pyright = { enable = true, filetypes = { "python" } },
    kotlin_language_server = {
      enable = true,
      filetypes = { "kotlin" },
      root_dir = root_pattern("build.gradle.kts", "pom.xml", ".git"),
    },
    smarty_ls = {
      enable = true,
      filetypes = { "smarty" },
      root_dir = root_pattern("composer.json", ".git"),
    },
    clangd = {
      enable = true,
      filetypes = { "c", "cpp", "objc", "objcpp", "cuda", "proto" },
      root_dir = root_pattern("compile_commands.json", ".git"),
    },
    asm_lsp = {
      enable = true,
      filetypes = { "asm", "s", "S" },
      root_dir = root_pattern("Makefile", ".git"),
    },
  },
  default_options = function(options)
    return vim.tbl_deep_extend("force", {
      on_attach = require "pi.lsp.attach",
      flags = require "pi.lsp.flags",
      capabilities = require("blink.cmp").get_lsp_capabilities(vim.lsp.protocol.make_client_capabilities()),
    }, options)
  end,
}