-- 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({
["<C-b>"] = cmp.mapping.scroll_docs(-4);
["<C-f>"] = cmp.mapping.scroll_docs(4);
["<C-Space>"] = cmp.mapping.complete();
["<C-e>"] = cmp.mapping.abort();
["<CR>"] = 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;
})