local coq = require('coq') vim.lsp.config('ts_ls', coq.lsp_ensure_capabilities({ cmd = { 'typescript-language-server', '--stdio' }, filetypes = { 'javascript', 'javascriptreact', 'typescript', 'typescriptreact' }, root_markers = { 'package.json', 'tsconfig.json', 'jsconfig.json' } })) vim.lsp.enable('ts_ls') vim.lsp.config('eslint', coq.lsp_ensure_capabilities({ cmd = { 'vscode-eslint-language-server', '--stdio' }, filetypes = { 'javascript', 'javascriptreact', 'typescript', 'typescriptreact' }, root_markers = { '.eslintrc', '.eslintrc.js', '.eslintrc.json', 'package.json' } })) vim.lsp.enable('eslint') vim.lsp.config('svelte', coq.lsp_ensure_capabilities({ cmd = { 'svelteserver', '--stdio' }, filetypes = { 'svelte' }, root_markers = { 'package.json', 'svelte.config.js' } })) vim.lsp.enable('svelte') vim.lsp.config('pyright', coq.lsp_ensure_capabilities({ cmd = { 'pyright-langserver', '--stdio' }, filetypes = { 'python' }, root_markers = { 'pyproject.toml', 'setup.py', 'requirements.txt' } })) vim.lsp.enable('pyright') vim.lsp.config('rust_analyzer', coq.lsp_ensure_capabilities({ cmd = { 'rust-analyzer' }, filetypes = { 'rust' }, root_markers = { 'Cargo.toml', 'rust-project.json' }, settings = { ['rust-analyzer'] = { imports = { granularity = { group = "module", }, prefix = "self", }, cargo = { buildScripts = { enable = true, }, }, procMacro = { enable = true }, checkOnSave = { enable = true, command = "clippy" } }, }, })) vim.lsp.enable('rust_analyzer') vim.lsp.config('lua_ls', coq.lsp_ensure_capabilities({ cmd = { 'lua-language-server' }, filetypes = { 'lua' }, root_markers = { '.luarc.json', '.luarc.jsonc', '.luacheckrc', 'stylua.toml', 'selene.toml' }, })) vim.lsp.enable('lua_ls') vim.lsp.config('gleam', coq.lsp_ensure_capabilities({ cmd = { 'gleam', 'lsp' }, filetypes = { 'gleam' }, root_markers = { 'gleam.toml' }, })) vim.lsp.enable('gleam') -- Enable inlay hints for Rust when LSP attaches vim.api.nvim_create_autocmd('LspAttach', { callback = function(args) local client = vim.lsp.get_client_by_id(args.data.client_id) if client and client.name == 'rust_analyzer' then vim.lsp.inlay_hint.enable(true, { bufnr = args.buf }) end end, }) -- Global mappings vim.keymap.set('n', 'e', vim.diagnostic.open_float) vim.keymap.set('n', '[d', vim.diagnostic.goto_prev) vim.keymap.set('n', ']d', vim.diagnostic.goto_next) vim.keymap.set('n', 'q', vim.diagnostic.setloclist) -- Use LspAttach autocommand to only map the following keys -- after the language server attaches to the current buffer vim.api.nvim_create_autocmd('LspAttach', { group = vim.api.nvim_create_augroup('UserLspConfig', {}), callback = function(ev) -- Enable completion triggered by vim.bo[ev.buf].omnifunc = 'v:lua.vim.lsp.omnifunc' -- Buffer local mappings local opts = { buffer = ev.buf } vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, opts) vim.keymap.set('n', 'gd', vim.lsp.buf.definition, opts) vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts) vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, opts) vim.keymap.set('n', '', vim.lsp.buf.signature_help, opts) vim.keymap.set('n', 'wa', vim.lsp.buf.add_workspace_folder, opts) vim.keymap.set('n', 'wr', vim.lsp.buf.remove_workspace_folder, opts) vim.keymap.set('n', 'wl', function() print(vim.inspect(vim.lsp.buf.list_workspace_folders())) end, opts) vim.keymap.set('n', 'D', vim.lsp.buf.type_definition, opts) vim.keymap.set('n', 'rn', vim.lsp.buf.rename, opts) vim.keymap.set({ 'n', 'v' }, 'ca', vim.lsp.buf.code_action, opts) vim.keymap.set('n', 'gr', vim.lsp.buf.references, opts) vim.keymap.set('n', 'f', function() vim.lsp.buf.format { async = true } end, opts) end, })