local util = require 'lspconfig.util' -- JAVASCRIPT FAMILY ----------------------------------------------------------- vim.lsp.config('ts_ls', { 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', { 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', { cmd = { 'svelteserver', '--stdio' }, filetypes = { 'svelte' }, root_markers = { 'package.json', 'svelte.config.js' } }) vim.lsp.enable('svelte') -- PYTHON ---------------------------------------------------------------------- vim.lsp.config('pyright', { cmd = { 'pyright-langserver', '--stdio' }, filetypes = { 'python' }, root_markers = { 'pyproject.toml', 'setup.py', 'requirements.txt' } }) vim.lsp.enable('pyright') -- RUST ------------------------------------------------------------------------ vim.lsp.config('rust_analyzer', { 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') -- LUA ------------------------------------------------------------------------- vim.lsp.config('lua_ls', { cmd = { 'lua-language-server' }, filetypes = { 'lua' }, root_markers = { '.luarc.json', '.luarc.jsonc', '.luacheckrc', 'stylua.toml', 'selene.toml' }, }) vim.lsp.enable('lua_ls') -- GLEAM------------------------------------------------------------------------ vim.lsp.config('gleam', { cmd = { 'gleam', 'lsp' }, filetypes = { 'gleam' }, root_markers = { 'gleam.toml' }, }) vim.lsp.enable('gleam') -- SWIFT AND THE Cs ------------------------------------------------------------ vim.lsp.config('sourcekit', { cmd = { 'sourcekit-lsp' }, filetypes = { 'swift', 'objc', 'objcpp', 'c', 'cpp' }, root_dir = function(bufnr, on_dir) local filename = vim.api.nvim_buf_get_name(bufnr) on_dir( util.root_pattern('buildServer.json', '.bsp')(filename) or util.root_pattern('*.xcodeproj', '*.xcworkspace')(filename) -- better to keep it at the end, because some modularized apps contain multiple Package.swift files or util.root_pattern('compile_commands.json', 'Package.swift')(filename) or vim.fs.dirname(vim.fs.find('.git', { path = filename, upward = true })[1]) ) end, get_language_id = function(_, ftype) local t = { objc = 'objective-c', objcpp = 'objective-cpp' } return t[ftype] or ftype end, capabilities = { workspace = { didChangeWatchedFiles = { dynamicRegistration = true, }, }, textDocument = { diagnostic = { dynamicRegistration = true, relatedDocumentSupport = true, }, }, }, }) vim.lsp.enable('sourcekit') -- 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, })