-- show diagnostic messages in quickfix list with vim.diagnostic.config({ virtual_text = false, signs = true, float = { border = 'single' }, }) vim.keymap.set("n", "", function() -- toggle quickfix list local windows = vim.fn.getwininfo() local qf_opened = false for i = 1, #windows, 1 do local window = windows[i] if window.quickfix == 1 then qf_opened = true break end end if qf_opened then vim.api.nvim_command("cclose") else vim.diagnostic.setqflist() end end) -- setup and config nvim-cmp completion local cmp = require("cmp") cmp.register_source("nvim_lsp_signature_help", require("cmp_nvim_lsp_signature_help").new()) cmp.setup({ -- set vim-vsnip as snippet engine for nvim-cmp completion snippet = { expand = function(args) vim.fn["vsnip#anonymous"](args.body) end, }, mapping = cmp.mapping.preset.insert { [''] = cmp.mapping.confirm({ select = true }), [''] = cmp.mapping.scroll_docs(4), [''] = cmp.mapping.scroll_docs(-4), }, -- complete based on LSP, Snippets and Buffer sources = cmp.config.sources({ { name = 'nvim_lsp' }, { name = 'vsnip' }, }, { { name = 'buffer' }, }) }) -- Jump forward or backward to snippet placeholders in insert mode vim.api.nvim_set_keymap("i", "", "(vsnip-jump-next)", { noremap = false }) vim.api.nvim_set_keymap("s", "", "(vsnip-jump-next)", { noremap = false }) vim.api.nvim_set_keymap("i", "", "(vsnip-jump-prev)", { noremap = false }) vim.api.nvim_set_keymap("s", "", "(vsnip-jump-prev)", { noremap = false }) -- complete text in search based on buffer cmp.setup.cmdline('/', { mapping = cmp.mapping.preset.cmdline(), sources = { { name = 'buffer' } } }) -- compete path in commandline cmp.setup.cmdline(':', { mapping = cmp.mapping.preset.cmdline(), sources = cmp.config.sources({ { name = 'path' } }, { { name = 'cmdline' } }), }) -- add additional completion capabilities local capabilities = require('cmp_nvim_lsp').default_capabilities() -- attaches settings after language server attaches to current buffer local on_attach = function(client, bufnr) local bufopts = { noremap = true, silent = true, buffer = bufnr } vim.keymap.set("n", "gd", vim.lsp.buf.definition, bufopts) vim.keymap.set("n", "gr", vim.lsp.buf.references, bufopts) vim.keymap.set("n", "gi", vim.lsp.buf.implementation, bufopts) vim.keymap.set("n", "K", vim.lsp.buf.hover, bufopts) vim.api.nvim_create_autocmd("BufWritePre", { pattern = "*", callback = function() vim.lsp.buf.format { async = false } end, }) end for _, method in ipairs({ 'textDocument/diagnostic', 'workspace/diagnostic' }) do local default_diagnostic_handler = vim.lsp.handlers[method] vim.lsp.handlers[method] = function(err, result, context, config) if err ~= nil and err.code == -32802 then return end return default_diagnostic_handler(err, result, context, config) end end -- Language Servers -- Rust vim.lsp.config('rust_analyzer', { capabilities = capabilities, on_attach = on_attach, settings = { ["rust-analyzer"] = { checkOnSave = { command = "clippy" }, assist = { importGranularity = "module", importPrefix = "by_self", }, cargo = { loadOutDirsFromCheck = true }, procMacro = { enable = true }, }, }, }) vim.lsp.enable('rust_analyzer') -- Bash vim.lsp.config('bashls', { capabilities = capabilities, on_attach = on_attach, }) vim.lsp.enable('bashls') -- Python vim.lsp.config('jedi_language_server', { capabilities = capabilities, on_attach = on_attach, }) vim.lsp.enable('jedi_language_server') -- HTML vim.lsp.config('html', { capabilities = capabilities, on_attach = on_attach, }) vim.lsp.enable('html') -- CSS vim.lsp.config('cssls', { capabilities = capabilities, on_attach = on_attach, }) vim.lsp.enable('cssl') -- Tex vim.lsp.config('texlab', { capabilities = capabilities, on_attach = on_attach, }) vim.lsp.enable('texlab') -- Svelte vim.lsp.config('svelte', { capabilities = capabilities, on_attach = on_attach, }) vim.lsp.enable('svelte') -- Typescript & Javascript vim.lsp.config('ts_ls', { capabilities = capabilities, on_attach = on_attach, filetypes = { "typescript", "javascript" }, }) vim.lsp.enable('ts_ls') -- JSON vim.lsp.config('jsonls', { capabilities = capabilities, on_attach = on_attach, }) vim.lsp.enable('jsonls') -- Lua vim.lsp.config('lua_ls', { capabilities = capabilities, on_attach = on_attach, settings = { Lua = { diagnostics = { globals = { "vim", "on_attach" } }, workspace = { library = vim.api.nvim_get_runtime_file("", true), } } } }) vim.lsp.enable('lua_ls') -- Java vim.lsp.config('jdtls', { capabilities = capabilities, on_attach = on_attach, }) vim.lsp.enable('jdtls') -- C lang vim.lsp.config('clangd', { capabilities = capabilities, on_attach = on_attach, }) vim.lsp.enable('clangd') -- Nushell vim.lsp.config('nushell', { capabilities = capabilities, on_attach = on_attach, }) vim.lsp.enable('nushell') -- Go vim.lsp.config('gopls', { capabilities = capabilities, on_attach = on_attach, }) vim.lsp.enable('gopls') -- Tailwind vim.lsp.config('tailwindcss', { capabilities = capabilities, on_attach = on_attach, init_options = { userLanguages = { rust = "html", } }, filetypes = { "html", "svelte", "rust" } }) vim.lsp.enable('tailwindcss') -- Elixir vim.lsp.config('expert', { capabilities = capabilities, on_attach = on_attach, --cmd = { 'bash', '/home/thev2/expert/apps/expert/_build/prod/rel/plain/bin/start_expert', '--stdio' }, cmd = { 'expert', '--stdio' }, root_markers = { 'mix.exs', '.git' }, filetypes = { 'elixir', 'eelixir', 'heex' }, }) vim.lsp.enable('expert') -- show nvim-lsp progress require "fidget".setup {}