-- Setup nvim-cmp. local cmp = require("cmp") cmp.setup({ snippet = { -- REQUIRED - you must specify a snippet engine expand = function(args) vim.fn["vsnip#anonymous"](args.body) -- For `vsnip` users. end; }; window = { completion = cmp.config.window.bordered(); documentation = cmp.config.window.bordered(); }; mapping = cmp.mapping.preset.insert({ [""] = cmp.mapping.scroll_docs(-4); [""] = cmp.mapping.scroll_docs(4); [""] = cmp.mapping.complete(); [""] = cmp.mapping.abort(); [""] = cmp.mapping.confirm({ select = true }); -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. }); sources = cmp.config.sources({ { name = "nvim_lsp"; entry_filter = function(entry) return require("cmp.types").lsp.CompletionItemKind[entry:get_kind()] ~= "Text" end; }; { name = "vsnip"; entry_filter = function(entry) return require("cmp.types").lsp.CompletionItemKind[entry:get_kind()] ~= "Text" end; }; }, { { name = "buffer"; entry_filter = function(entry) return require("cmp.types").lsp.CompletionItemKind[entry:get_kind()] ~= "Text" end; }; }); }) -- Set configuration for specific filetype. cmp.setup.filetype("gitcommit", { sources = cmp.config.sources({ { name = "cmp_git" }; -- You can specify the `cmp_git` source if you were installed it. }, { { name = "buffer" } }); }) -- Use buffer source for `/` (if you enabled `native_menu`, this won't work anymore). cmp.setup.cmdline("/", { mapping = cmp.mapping.preset.cmdline(); sources = { { name = "buffer" } }; }) -- Use cmdline & path source for ':' (if you enabled `native_menu`, this won't work anymore). cmp.setup.cmdline(":", { mapping = cmp.mapping.preset.cmdline(); sources = cmp.config.sources({ { name = "path" } }, { { name = "cmdline" } }); }) -- Setup lspconfig. local cmplsp = require("cmp_nvim_lsp") local capabilities = vim.lsp.protocol.make_client_capabilities() cmplsp.default_capabilities(vim.lsp.protocol.make_client_capabilities()) -- Enable (broadcasting) snippet capability for completion capabilities.textDocument.completion.completionItem.snippetSupport = true cmp.setup({ formatting = { format = require("lspkind").cmp_format({ mode = "symbol"; -- show only symbol annotations maxwidth = 50; -- prevent the popup from showing more than provided characters (e.g 50 will not show more than 50 characters) -- The function below will be called before any actual modifications from lspkind -- so that you can provide more controls on popup customization. (See [#30](https://github.com/onsails/lspkind-nvim/pull/30)) ---@diagnostic disable-next-line: unused-local before = function(entry, vim_item) return vim_item end; }); }; }) local on_attach = function(client, bufnr) vim.api.nvim_buf_set_option(bufnr, "omnifunc", "v:lua.vim.lsp.omnifunc") local lsp_signature = require("lsp_signature") lsp_signature.on_attach({ bind = true }, bufnr) require("lsp-inlayhints").setup() require("lsp-inlayhints").on_attach(client, bufnr, false) end vim.api.nvim_create_augroup("LspAttach_inlayhints", {}) vim.api.nvim_create_autocmd("LspAttach", { group = "LspAttach_inlayhints"; callback = function(args) if not (args.data and args.data.client_id) then return end local bufnr = args.buf local client = vim.lsp.get_client_by_id(args.data.client_id) require("lsp-inlayhints").on_attach(client, bufnr, false) end; }) local lsputils = require("lspconfig").util require("lspconfig").tsserver.setup({ on_attach = on_attach; root_dir = lsputils.root_pattern("package.json", "tsconfig.json"); settings = { typescript = { inlayHints = { includeInlayParameterNameHints = "all"; includeInlayParameterNameHintsWhenArgumentMatchesName = true; includeInlayFunctionParameterTypeHints = true; includeInlayVariableTypeHints = true; includeInlayPropertyDeclarationTypeHints = true; includeInlayFunctionLikeReturnTypeHints = true; includeInlayEnumMemberValueHints = true; }; }; javascript = { inlayHints = { includeInlayParameterNameHints = "all"; includeInlayParameterNameHintsWhenArgumentMatchesName = true; includeInlayFunctionParameterTypeHints = true; includeInlayVariableTypeHints = true; includeInlayPropertyDeclarationTypeHints = true; includeInlayFunctionLikeReturnTypeHints = true; includeInlayEnumMemberValueHints = true; }; }; }; }) -- require("deno-nvim").setup({ -- server = { -- root_dir = vim.loop.cwd; -- capabilities = capabilities; -- on_attach = on_attach; -- settings = { -- deno = { -- unstable = true; -- inlayHints = { -- enumMemberValues = { enabled = true }; -- functionLikeReturnTypes = { enabled = true }; -- parameterNames = { enabled = "all" }; -- parameterTypes = { enabled = true }; -- propertyDeclarationTypes = { enabled = true }; -- variableTypes = { enabled = true; suppressWhenTypeMatchesName = false }; -- }; -- }; -- }; -- }; -- }); require("lspconfig").rust_analyzer.setup({ capabilities = capabilities; on_attach = on_attach; }) require("lspconfig").sqls.setup({ on_attach = function(client, bufnr) require("sqls").on_attach(client, bufnr) on_attach(client, bufnr) end; capabilities = capabilities; }) require("lspconfig").omnisharp.setup({ cmd = { "omnisharp" }; handlers = { ["textDocument/definition"] = require("omnisharp_extended").handler; }; on_attach = on_attach; capabilities = capabilities; -- Enables support for reading code style, naming convention and analyzer -- settings from .editorconfig. enable_editorconfig_support = true; -- If true, MSBuild project system will only load projects for files that -- were opened in the editor. This setting is useful for big C# codebases -- and allows for faster initialization of code navigation features only -- for projects that are relevant to code that is being edited. With this -- setting enabled OmniSharp may load fewer projects and may thus display -- incomplete reference lists for symbols. enable_ms_build_load_projects_on_demand = false; -- Enables support for roslyn analyzers, code fixes and rulesets. enable_roslyn_analyzers = true; -- Specifies whether 'using' directives should be grouped and sorted during -- document formatting. organize_imports_on_format = true; -- Enables support for showing unimported types and unimported extension -- methods in completion lists. When committed, the appropriate using -- directive will be added at the top of the current file. This option can -- have a negative impact on initial completion responsiveness, -- particularly for the first few completion sessions after opening a -- solution. enable_import_completion = true; -- Specifies whether to include preview versions of the .NET SDK when -- determining which version to use for project loading. sdk_include_prereleases = true; -- Only run analyzers against open files when 'enableRoslynAnalyzers' is -- true analyze_open_documents_only = false; }) require("lspconfig").marksman.setup({ root_dir = vim.loop.cwd; on_attach = on_attach; capabilities = capabilities; }) require("lspconfig").jsonls.setup({ capabilities = capabilities; cmd = { "vscode-json-language-server"; "--stdio" }; on_attach = on_attach; }) require("lspconfig").html.setup({ capabilities = capabilities; cmd = { "vscode-html-language-server"; "--stdio" }; on_attach = on_attach; }) require("lspconfig").cssls.setup({ capabilities = capabilities; on_attach = on_attach; }) require("lspconfig").bashls.setup({ capabilities = capabilities; on_attach = on_attach; }) require("lspconfig").clangd.setup({ capabilities = capabilities; on_attach = on_attach; }) require("lspconfig").dockerls.setup({ capabilities = capabilities; on_attach = on_attach; }) require("lspconfig").eslint.setup({ capabilities = capabilities; on_attach = on_attach; }) require("lspconfig").lua_ls.setup({ capabilities = capabilities; on_attach = on_attach; settings = { Lua = { runtime = { -- Tell the language server which version of Lua you're using (most likely LuaJIT in the case of Neovim) version = "LuaJIT"; }; diagnostics = { -- Get the language server to recognize the `vim` global globals = { "vim" }; }; workspace = { -- Make the server aware of Neovim runtime files library = vim.api.nvim_get_runtime_file("", true); }; -- Do not send telemetry data containing a randomized but unique identifier telemetry = { enable = false }; }; }; }) require("lspconfig").jedi_language_server.setup({}) local null_ls = require("null-ls") null_ls.setup({ sources = { -- null_ls.builtins.diagnostics.eslint; -- null_ls.builtins.formatting.eslint; null_ls.builtins.formatting.lua_format; -- null_ls.builtins.formatting.prettier; null_ls.builtins.formatting.rustfmt; -- null_ls.builtins.code_actions.shellcheck; -- null_ls.builtins.completion.spell; -- null_ls.builtins.diagnostics.tsc; -- null_ls.builtins.formatting.deno_fmt; -- null_ls.builtins.code_actions.gitsigns.with({ -- config = { -- filter_actions = function(title) -- -- filter out blame actions -- return title:lower():match("blame") == nil -- end; -- }; -- }); }; }) -- Debugging local dap, dapui = require("dap"), require("dapui") dapui.setup() dap.listeners.after.event_initialized["dapui_config"] = function() dapui.open() end dap.listeners.before.event_terminated["dapui_config"] = function() dapui.close() end dap.listeners.before.event_exited["dapui_config"] = function() dapui.close() end dap.adapters.coreclr = { type = "executable"; command = "netcoredbg"; args = { "--interpreter=vscode" }; } vim.g.dotnet_build_project = function() local default_path = vim.fn.getcwd() .. "/" if vim.g["dotnet_last_proj_path"] ~= nil then default_path = vim.g["dotnet_last_proj_path"] end local path = vim.fn.input("Path to your *proj file", default_path, "file") vim.g["dotnet_last_proj_path"] = path local cmd = "dotnet build -c Debug " .. path .. " > /dev/null" print("") print("Cmd to execute: " .. cmd) local f = os.execute(cmd) if f == 0 then print("\nBuild: ✔️ ") else print("\nBuild: ❌ (code: " .. f .. ")") end end vim.g.dotnet_get_dll_path = function() local request = function() return vim.fn.input("Path to dll", vim.fn.getcwd() .. "/bin/Debug/", "file") end if vim.g["dotnet_last_dll_path"] == nil then vim.g["dotnet_last_dll_path"] = request() else if vim.fn.confirm("Do you want to change the path to dll?\n" .. vim.g["dotnet_last_dll_path"], "&yes\n&no", 2) == 1 then vim.g["dotnet_last_dll_path"] = request() end end return vim.g["dotnet_last_dll_path"] end dap.configurations.cs = { { type = "coreclr"; name = "launch - netcoredbg"; request = "launch"; program = function() if vim.fn.confirm("Should I recompile first?", "&yes\n&no", 2) == 1 then vim.g.dotnet_build_project() end return vim.g.dotnet_get_dll_path() end; }; { -- If you get an "Operation not permitted" error using this, try disabling YAMA: -- echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope name = "Attach to process"; type = "cs"; request = "attach"; pid = require("dap.utils").pick_process; args = {}; }; } vim.diagnostic.config({ virtual_text = false; signs = true; underline = true; update_in_insert = false; severity_sort = true; })