nvim/lua/plugins/lsp.lua

414 lines
13 KiB
Lua
Raw Normal View History

2023-02-26 13:20:49 +01:00
local lsp_attach = function(client, buf)
2024-10-16 15:56:59 +02:00
vim.api.nvim_set_option_value("formatexpr", "v:lua.vim.lsp.formatexpr()", { buf = buf })
vim.api.nvim_set_option_value("omnifunc", "v:lua.vim.lsp.omnifunc", { buf = buf })
vim.api.nvim_set_option_value("tagfunc", "v:lua.vim.lsp.tagfunc", { buf = buf })
2023-02-26 13:20:49 +01:00
vim.lsp.inlay_hint.enable(true, nil)
2024-01-17 15:10:36 +01:00
2023-02-26 13:20:49 +01:00
local bufopts = { noremap = true, silent = true, buffer = buf }
local wk = require("which-key")
2024-10-16 15:56:59 +02:00
local diag_next = function()
vim.diagnostic.jump({ count = 1, float = true })
end
local diag_prev = function()
vim.diagnostic.jump({ count = -1, float = true })
end
wk.add({
{ '<C-e>', require("telescope.builtin").diagnostics, bufopts, desc = "Show diagnostics under cursor" },
2024-10-16 15:56:59 +02:00
{ '<leader>e', vim.diagnostic.open_float, bufopts, desc = "Show diagnostics in buffer" },
{ '[d', diag_prev, bufopts },
{ ']d', diag_next, bufopts },
{ 'gD', vim.lsp.buf.declaration, bufopts, desc = "Go to declaration" },
{ 'gd', vim.lsp.buf.definition, bufopts, desc = "Go to definition" },
{ 'gi', vim.lsp.buf.implementation, bufopts, desc = "Go to implementation" },
{ '<C-k>', vim.lsp.buf.signature_help, bufopts, desc = "Show signature" },
{ '<leader>rn', vim.lsp.buf.rename, bufopts, desc = "Rename" },
{ '<leader>ca', vim.lsp.buf.code_action, bufopts, desc = "Show code actions" },
{ 'gr', require("telescope.builtin").lsp_references, bufopts, desc = "Shwo references" },
})
2023-02-26 13:20:49 +01:00
end
2023-04-03 12:40:26 +02:00
local mason_path = vim.fn.glob(vim.fn.stdpath "data" .. "/mason/packages/codelldb/extension/")
local codelldb_path = mason_path .. "adapter/codelldb"
local liblldb_path = mason_path .. "lldb/lib/liblldb.so"
if vim.fn.has "mac" == 1 then
liblldb_path = mason_path .. "lldb/lib/liblldb.dylib"
end
return {
-- lsp
2023-02-26 13:20:49 +01:00
{
'williamboman/mason.nvim',
2024-10-16 15:56:59 +02:00
lazy = true,
2023-02-26 13:20:49 +01:00
config = true
},
{
'williamboman/mason-lspconfig.nvim',
config = true
},
{
'neovim/nvim-lspconfig',
config = function()
local capabilities = require('cmp_nvim_lsp').default_capabilities()
local lspconfig = require('lspconfig')
lspconfig.lua_ls.setup {
capabilities = capabilities,
root_dir = lspconfig.util.root_pattern('.git'),
2023-02-26 13:20:49 +01:00
settings = {
Lua = {
runtime = {
-- Tell the language server which version of Lua you're using (most likely LuaJIT in the case of Neovim)
version = 'LuaJIT',
},
2023-02-26 13:20:49 +01:00
diagnostics = {
-- Get the language server to recognize the `vim` global
2023-02-26 13:20:49 +01:00
globals = { 'vim' }
},
workspace = {
-- Make the server aware of Neovim runtime files
library = vim.api.nvim_get_runtime_file("", true),
2023-04-03 12:40:26 +02:00
checkThirdParty = false,
},
2023-02-26 13:20:49 +01:00
}
},
on_attach = lsp_attach
}
2024-09-18 08:58:49 +02:00
lspconfig.ts_ls.setup {
2023-02-26 13:20:49 +01:00
capabilities = capabilities,
on_attach = lsp_attach
}
lspconfig.gopls.setup {
capabilities = capabilities,
on_attach = lsp_attach
}
--lspconfig.rust_analyzer.setup {
-- capabilities = capabilities,
-- on_attach = lsp_attach
--}
lspconfig.bashls.setup {
capabilities = capabilities,
on_attach = lsp_attach
}
lspconfig.sqlls.setup({
capabilities = capabilities,
on_attach = lsp_attach
})
lspconfig.html.setup({
capabilities = capabilities,
on_attach = lsp_attach
})
lspconfig.cssls.setup({
capabilities = capabilities,
on_attach = lsp_attach
})
lspconfig.tailwindcss.setup({
capabilities = capabilities,
2023-04-03 12:40:26 +02:00
on_attach = lsp_attach
})
lspconfig.phpactor.setup({
capabilities = capabilities,
2023-02-26 13:20:49 +01:00
on_attach = lsp_attach
})
2024-09-17 07:53:21 +02:00
lspconfig.julials.setup({
capabilities = capabilities,
on_attach = lsp_attach
})
lspconfig.wgsl_analyzer.setup({
capabilities = capabilities,
on_attach = lsp_attach
})
lspconfig.glsl_analyzer.setup({
capabilities = capabilities,
on_attach = lsp_attach
})
2023-02-26 13:20:49 +01:00
capabilities.textDocument.completion.completionItem.snippetSupport = true
lspconfig.emmet_ls.setup({
capabilities = capabilities,
on_attach = lsp_attach
})
end
},
2024-01-17 15:10:36 +01:00
{
'mrcjkb/rustaceanvim',
version = "^4",
lazy = false,
2024-01-17 15:10:36 +01:00
ft = { "rust" },
config = function()
vim.g.rustaceanvim = {
server = {
on_attach = lsp_attach,
settings = {
-- rust-analyzer language server configuration
["rust-analyzer"] = {
rustfmt = {
extraArgs = { "+nightly" },
},
cargo = {
loadOutDirsFromCheck = true,
runBuildScripts = true,
},
-- Add clippy lints for Rust.
checkOnSave = {
allFeatures = true,
command = "clippy",
extraArgs = { "--no-deps" },
},
-- TODO this breaks diagnostics, look into what can be done
-- procMacro = {
-- enable = true,
-- ignored = {
-- ["async-trait"] = { "async_trait" },
-- ["napi-derive"] = { "napi" },
-- ["async-recursion"] = { "async_recursion" },
-- },
-- },
},
},
}
}
end
},
{
'mfussenegger/nvim-jdtls',
ft = { "java" },
config = function()
local home = os.getenv('HOME')
local jdtls = require('jdtls')
local capabilities = require('cmp_nvim_lsp').default_capabilities()
local root_markers = { 'gradlew', 'mvnw', 'git' }
local root_dir = require('jdtls.setup').find_root(root_markers)
local workspace_folder = home .. "/.local/share/eclipse/" .. vim.fn.fnamemodify(root_dir, ":p:h:t")
local config = {
flags = {
debounce_text_changes = 80,
},
capabilities = capabilities,
on_attach = lsp_attach, -- We pass our on_attach keybindings to the configuration map
root_dir = root_dir, -- Set the root directory to our found root_marker
-- here you can configure eclipse.jdt.ls specific settings
-- these are defined by the eclipse.jdt.ls project and will be passed to eclipse when starting.
-- see https://github.com/eclipse/eclipse.jdt.ls/wiki/running-the-java-ls-server-from-the-command-line#initialize-request
-- for a list of options
settings = {
java = {
format = {
settings = {
-- use google java style guidelines for formatting
-- to use, make sure to download the file from https://github.com/google/styleguide/blob/gh-pages/eclipse-java-google-style.xml
-- and place it in the ~/.local/share/eclipse directory
-- url = "/.local/share/eclipse/eclipse-java-google-style.xml",
-- profile = "googlestyle",
},
},
signaturehelp = { enabled = true },
contentprovider = { preferred = 'fernflower' }, -- use fernflower to decompile library code
-- specify any completion options
completion = {
favoritestaticmembers = {
-- "org.hamcrest.matcherassert.assertthat",
-- "org.hamcrest.matchers.*",
-- "org.hamcrest.corematchers.*",
-- "org.junit.jupiter.api.assertions.*",
-- "java.util.objects.requirenonnull",
-- "java.util.objects.requirenonnullelse",
-- "org.mockito.mockito.*"
},
filteredtypes = {
-- "com.sun.*",
-- "io.micrometer.shaded.*",
-- "java.awt.*",
-- "jdk.*", "sun.*",
},
},
-- specify any options for organizing imports
sources = {
organizeimports = {
starthreshold = 9999,
staticstarthreshold = 9999,
},
},
-- how code generation should act
codegeneration = {
tostring = {
template = "${object.classname}{${member.name()}=${member.value}, ${othermembers}}"
},
hashcodeequals = {
usejava7objects = true,
},
useblocks = true,
},
-- if you are developing in projects with different java versions, you need
-- to tell eclipse.jdt.ls to use the location of the jdk for your java version
-- see https://github.com/eclipse/eclipse.jdt.ls/wiki/running-the-java-ls-server-from-the-command-line#initialize-request
-- and search for `interface runtimeoption`
-- the `name` is not arbitrary, but must match one of the elements from `enum executionenvironment` in the link above
configuration = {
runtimes = {
{
name = "JavaSE-17",
path = home .. "/.local/share/asdf/installs/java/oracle-17.0.11/",
},
{
name = "JavaSE-21",
path = home .. "/.local/share/asdf/installs/java/oracle-21.0.2/",
},
{
name = "JavaSE-1.8",
path = home .. "/.local/share/asdf/installs/java/adoptopenjdk-8.0.412+8/"
},
}
}
}
},
-- cmd is the command that starts the language server. whatever is placed
-- here is what is passed to the command line to execute jdtls.
-- note that eclipse.jdt.ls must be started with a java version of 17 or higher
-- see: https://github.com/eclipse/eclipse.jdt.ls#running-from-the-command-line
-- for the full list of options
cmd = {
home .. "/.local/share/asdf/installs/java/oracle-21.0.2/bin/java",
'-Declipse.application=org.eclipse.jdt.ls.core.id1',
'-Dosgi.bundles.defaultstartlevel=4',
'-Declipse.product=org.eclipse.jdt.ls.core.product',
'-Dlog.protocol=true',
'-Dlog.level=all',
'-Xmx4G',
'--add-modules=ALL-SYSTEM',
'--add-opens', 'java.base/java.util=ALL-UNNAMED',
'--add-opens', 'java.base/java.lang=ALL-UNNAMED',
-- if you use lombok, download the lombok jar and place it in ~/.local/share/eclipse
'-javaagent:' .. home .. '/.local/share/nvim/mason/packages/jdtls/lombok.jar',
-- the jar file is located where jdtls was installed. this will need to be updated
-- to the location where you installed jdtls
'-jar', vim.fn.glob(
home ..
'/.local/share/nvim/mason/packages/jdtls/plugins/org.eclipse.equinox.launcher_*.jar'),
-- the configuration for jdtls is also placed where jdtls was installed. this will
-- need to be updated depending on your environment
'-configuration', home .. '/.local/share/nvim/mason/packages/jdtls/config_linux',
-- use the workspace_folder defined above to store data for this project
'-data', workspace_folder,
},
}
jdtls.start_or_attach(config)
end
},
{ 'onsails/lspkind-nvim' }, -- pictograms replace (?) with lspsaga
2023-02-26 13:34:44 +01:00
{
'j-hui/fidget.nvim',
config = true
}, -- show lsp status
-- completion
{
'hrsh7th/nvim-cmp',
2023-02-26 13:34:44 +01:00
config = function()
2023-02-26 13:20:49 +01:00
local cmp = require('cmp')
local lspkind = require('lspkind')
vim.opt.shortmess:append 'c'
cmp.setup({
snippet = {
expand = function(args)
require('luasnip').lsp_expand(args.body)
end,
},
mapping = cmp.mapping.preset.insert({
["<C-n>"] = cmp.mapping.select_next_item { behavior = cmp.SelectBehavior.Insert },
["<C-p>"] = cmp.mapping.select_prev_item { behavior = cmp.SelectBehavior.Insert },
2023-09-23 14:54:20 +02:00
['<C-b>'] = cmp.mapping(cmp.mapping.scroll_docs(-4), { 'i', 'c' }),
2023-02-26 13:20:49 +01:00
['<C-f>'] = cmp.mapping(cmp.mapping.scroll_docs(4), { 'i', 'c' }),
['<C-s>'] = cmp.mapping(cmp.mapping.complete(), { 'i', 'c' }),
['<C-y>'] = cmp.mapping.confirm({
behavior = cmp.ConfirmBehavior.Insert,
select = true
}),
['<C-e>'] = cmp.mapping({
i = cmp.mapping.abort(),
c = cmp.mapping.close(),
}),
['<CR>'] = cmp.mapping.confirm({ select = true }),
}),
sources = cmp.config.sources({
{ name = 'nvim_lua' },
{ name = 'nvim_lsp' },
{ name = 'path' },
{ name = 'luasnip' },
{ name = 'nvim_lsp_signature_help' },
2023-02-26 13:34:44 +01:00
}, {
{ name = 'buffer', keyword_length = 5 },
2023-02-26 13:20:49 +01:00
}),
formatting = {
format = lspkind.cmp_format {
with_text = true,
menu = {
buffer = "[buf]",
nvim_lsp = "[LSP]",
nvim_lua = "[api]",
path = "[path]",
luasnip = "[snip]",
}
}
}
})
-- Use buffer source for `/` (basically search words in buffer)
cmp.setup.cmdline('/', {
sources = {
{ name = 'buffer' }
}
})
-- Use cmdline & path source for ':'
cmp.setup.cmdline(':', {
sources = cmp.config.sources({
{ name = 'path' }
2023-02-26 13:34:44 +01:00
}, {
{ name = 'cmdline' }
2023-02-26 13:20:49 +01:00
})
})
end,
event = 'InsertEnter',
dependencies = {
'hrsh7th/cmp-nvim-lsp',
'hrsh7th/cmp-nvim-lsp-signature-help',
'hrsh7th/cmp-buffer',
'hrsh7th/cmp-path',
'hrsh7th/cmp-nvim-lua',
'hrsh7th/cmp-cmdline',
'saadparwaiz1/cmp_luasnip',
}
2023-02-26 13:20:49 +01:00
},
{
'L3MON4D3/LuaSnip',
2024-01-03 13:17:03 +01:00
version = "v2.*",
build = "make install_jsregexp",
2023-02-26 13:20:49 +01:00
config = function()
require("luasnip.loaders.from_lua").load({ paths = "~/.config/nvim/snippets/" })
end
},
{
'windwp/nvim-autopairs',
config = true
},
2024-01-18 12:43:07 +01:00
{
"folke/trouble.nvim",
dependencies = { "nvim-tree/nvim-web-devicons" },
opts = {
-- your configuration comes here
-- or leave it empty to use the default settings
-- refer to the configuration section below
},
},
}