local default = { capabilities = require('cmp_nvim_lsp').default_capabilities() } local servers = { java_language_server = { cmd = { "java-language-server" } }, ocamllsp = {}, pyright = {}, basedpyright = {}, lua_ls = {}, clangd = {}, ccls = { init_options = { highlight = { rainbow = 10, }, }, }, -- jedi_language_server = {}, nixd = {}, nil_ls = {}, ltex = { filetypes = { "latex", "typst", "typ", "bib", "markdown", "plaintex", "tex" }, settings = { ltex = { language = "fr", enabled = { "latex", "typst", "typ", "bib", "markdown", "plaintex", "tex" }, }, }, }, elixirls = { cmd = { "elixir-ls" }, }, rust_analyzer = {}, glslls = { cmd = { "glslls", "--target-env", "opengl", "--stdin" }, }, qmlls = {}, } local enabled = {} for server, config in pairs(servers) do local lsp = require("lspconfig")[server] -- print(server) local config = vim.tbl_deep_extend("keep", config, default, lsp.document_config.default_config) if config.cmd ~= nil then if vim.fn.executable(config.cmd[1]) == 1 then enabled[server] = config end end end for server, config in pairs(enabled) do local lsp = require("lspconfig")[server] lsp.setup(config) end vim.diagnostic.config({ virtual_text = false, -- signs = true, underline = true, -- update_in_insert = false, -- severity_sort = false, }) vim.api.nvim_create_autocmd("LspAttach", { callback = function(args) vim.schedule(function() local client = vim.lsp.get_client_by_id(args.data.client_id) if client then local signatureProvider = client.server_capabilities.signatureHelpProvider if signatureProvider and signatureProvider.triggerCharacters then local M = {} local api = vim.api vim.lsp.handlers["textDocument/signatureHelp"] = vim.lsp.with(vim.lsp.handlers.signature_help, { focusable = false, silent = true, max_height = 7, }) local function check_triggeredChars(triggerChars) local cur_line = api.nvim_get_current_line() local pos = api.nvim_win_get_cursor(0)[2] local prev_char = cur_line:sub(pos - 1, pos - 1) local cur_char = cur_line:sub(pos, pos) for _, char in ipairs(triggerChars) do if cur_char == char or prev_char == char then return true end end end M.setup = function(client, bufnr) local group = api.nvim_create_augroup("LspSignature", { clear = false }) api.nvim_clear_autocmds { group = group, buffer = bufnr } local triggerChars = client.server_capabilities.signatureHelpProvider.triggerCharacters api.nvim_create_autocmd("TextChangedI", { group = group, buffer = bufnr, callback = function() if check_triggeredChars(triggerChars) then vim.lsp.buf.signature_help() end end, }) end M.setup(client, args.buf) end end end) end, })