aboutsummaryrefslogblamecommitdiff
path: root/.config/nvim/lua/lsp.lua
blob: 5e8ddf8c140fb9871e48a9c4ed024cff3afa6ca3 (plain) (tree)





















                                                                                                                                                                        

                                          
                                                      

                                                                                                       



                                       
                                                      

                                                                                                       

                            
            

                                        
                                                      

                                                                                                       
                            
                  
           





















                                                                                                       

                                                                
                                                                        

                                                                         
 
           
                      
                                                        




                                                                                                                                                     
                                                                      


                                                                               

  

                                                                                

                                                       

                                                                 

   







                                                                            
                                                                         


            

                                          

                                     
                                                                          























                                                                                             

  



















                                                                                                                
 
                                          
                                    

                              
 
                                 
                                           


                                                        
                                    
  

                                      
                              
 



                                                                                    
                              
                                    

                                                                                 

                                           





                                                                                 

                                                        
                                                                         
                                       
 

                                                                                   
                                          
 





                                                                                  
                                        
 

                                                                             

                                       

                                                                                
                                            
  
 
                                     
                                
                              
                                    

  

                                    
                                                           
                              

  

                                    
                                                           
                              

  


                                    

  










































                                                                                                                                        
                                                   
 



                                  



                                                        
                                                    











                                                                                  
          

  









































































                                                                                                                          
                       
                             





                                 
-- 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;
})