-- 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, }