2023-09-19 05:21:43 +00:00
|
|
|
local nvim_lsp = require("lspconfig")
|
2023-09-19 05:28:46 +00:00
|
|
|
|
2023-09-19 04:51:33 +00:00
|
|
|
local on_attach = function(client, bufnr)
|
2023-09-19 05:21:43 +00:00
|
|
|
-- TODO: use vim.api.nvim_create_autocmd
|
|
|
|
vim.api.nvim_exec2([[autocmd User LspDiagnosticsChanged call lightline#update()]], { output = false })
|
|
|
|
|
|
|
|
local opts = { noremap = true, silent = false }
|
|
|
|
vim.api.nvim_buf_set_keymap(bufnr, "n", "gd", "<Cmd>lua vim.lsp.buf.definition()<CR>", opts)
|
|
|
|
vim.api.nvim_buf_set_keymap(bufnr, "n", "gD", "<Cmd>lua vim.lsp.buf.type_definition()<CR>", opts)
|
|
|
|
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>gd", "<Cmd>lua vim.lsp.buf.definition()<CR>", opts)
|
|
|
|
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>gD", "<Cmd>lua vim.lsp.buf.type_definition()<CR>", opts)
|
|
|
|
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>e", "<Cmd>lua vim.lsp.buf.rename()<CR>", opts)
|
|
|
|
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>r", "<Cmd>lua vim.lsp.buf.references()<CR>", opts)
|
|
|
|
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>i", "<Cmd>lua vim.lsp.buf.implementation()<CR>", opts)
|
|
|
|
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>ca", "<Cmd>lua vim.lsp.buf.code_action()<CR>", opts)
|
|
|
|
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>ci", "<Cmd>lua vim.lsp.buf.incoming_calls()<CR>", opts)
|
|
|
|
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>co", "<Cmd>lua vim.lsp.buf.outgoing_calls()<CR>", opts)
|
|
|
|
vim.api.nvim_buf_set_keymap(bufnr, "n", "K", "<Cmd>lua vim.lsp.buf.hover()<CR>", opts)
|
|
|
|
vim.api.nvim_buf_set_keymap(bufnr, "n", "]e", '<Cmd>lua vim.diagnostic.goto_next({severity="Error"})<CR>', opts)
|
|
|
|
vim.api.nvim_buf_set_keymap(bufnr, "n", "[e", '<Cmd>lua vim.diagnostic.goto_prev({severity="Error"})<CR>', opts)
|
|
|
|
vim.api.nvim_buf_set_keymap(bufnr, "n", "]d", "<Cmd>lua vim.diagnostic.goto_next()<CR>", opts)
|
|
|
|
vim.api.nvim_buf_set_keymap(bufnr, "n", "[d", "<Cmd>lua vim.diagnostic.goto_prev()<CR>", opts)
|
|
|
|
vim.api.nvim_buf_set_keymap(bufnr, "n", "cd", "<Cmd>lua vim.diagnostic.hide(nil, 0)<CR>", opts)
|
|
|
|
|
|
|
|
-- fzf triggers:
|
|
|
|
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>fr", "<Cmd>References<CR>", opts)
|
|
|
|
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>fi", "<Cmd>Implementations<CR>", opts)
|
|
|
|
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>fs", "<Cmd>DocumentSymbols<CR>", opts)
|
|
|
|
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>fw", "<Cmd>WorkspaceSymbols<CR>", opts)
|
|
|
|
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>fc", "<Cmd>CodeActions<CR>", opts)
|
|
|
|
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>fci", "<Cmd>IncomingCalls<CR>", opts)
|
|
|
|
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>fco", "<Cmd>OutgoingCalls<CR>", opts)
|
|
|
|
|
|
|
|
require("lsp_signature").on_attach({
|
|
|
|
hint_enable = false,
|
|
|
|
})
|
|
|
|
|
|
|
|
require("copilot_cmp").setup()
|
2023-09-19 04:51:33 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
-- Go
|
|
|
|
|
2023-09-19 05:21:43 +00:00
|
|
|
local capabilities = require("cmp_nvim_lsp").default_capabilities()
|
2023-09-19 04:51:33 +00:00
|
|
|
capabilities.textDocument.completion.completionItem.snippetSupport = true
|
|
|
|
capabilities.textDocument.completion.completionItem.resolveSupport = {
|
2023-09-19 05:21:43 +00:00
|
|
|
properties = {
|
|
|
|
"documentation",
|
|
|
|
"detail",
|
|
|
|
"additionalTextEdits",
|
|
|
|
},
|
2023-09-19 04:51:33 +00:00
|
|
|
}
|
|
|
|
|
2023-09-19 05:21:43 +00:00
|
|
|
nvim_lsp.gopls.setup({
|
|
|
|
settings = {
|
|
|
|
gopls = {
|
|
|
|
staticcheck = true,
|
|
|
|
-- Disalbing linksInHover may not be working as expected:
|
|
|
|
linksInHover = false,
|
|
|
|
usePlaceholders = true,
|
|
|
|
analyses = {
|
|
|
|
unusedparams = true,
|
|
|
|
shadow = true,
|
|
|
|
unusedwrite = true,
|
|
|
|
unusedresult = true,
|
|
|
|
nilness = true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
capabilities = capabilities,
|
|
|
|
on_attach = on_attach,
|
|
|
|
})
|
2023-09-19 04:51:33 +00:00
|
|
|
|
|
|
|
-- Rust
|
2023-09-19 05:21:43 +00:00
|
|
|
nvim_lsp.rust_analyzer.setup({
|
|
|
|
capabilities = capabilities,
|
|
|
|
on_attach = on_attach,
|
|
|
|
settings = {
|
|
|
|
["rust-analyzer"] = {
|
|
|
|
imports = {
|
|
|
|
granularity = {
|
|
|
|
group = "module",
|
|
|
|
},
|
|
|
|
prefix = "self",
|
|
|
|
},
|
|
|
|
cargo = {
|
|
|
|
buildScripts = {
|
|
|
|
enable = true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
procMacro = {
|
|
|
|
enable = false,
|
|
|
|
},
|
|
|
|
diagnostics = {
|
|
|
|
disabled = { "unresolved-proc-macro" },
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
})
|
2023-09-19 04:51:33 +00:00
|
|
|
|
|
|
|
-- Ruby
|
|
|
|
|
2023-09-19 05:21:43 +00:00
|
|
|
nvim_lsp.solargraph.setup({
|
|
|
|
on_attach = on_attach,
|
|
|
|
})
|
2023-09-19 04:51:33 +00:00
|
|
|
|
|
|
|
-- Typescript
|
|
|
|
-- https://jose-elias-alvarez.medium.com/configuring-neovims-lsp-client-for-typescript-development-5789d58ea9c
|
|
|
|
|
2023-09-19 05:21:43 +00:00
|
|
|
nvim_lsp.tsserver.setup({
|
|
|
|
on_attach = on_attach,
|
|
|
|
})
|
2023-09-19 04:51:33 +00:00
|
|
|
|
|
|
|
local filetypes = {
|
2023-09-19 05:21:43 +00:00
|
|
|
typescript = "eslint",
|
|
|
|
typescriptreact = "eslint",
|
2023-09-19 04:51:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
-- diagnosticls
|
|
|
|
|
|
|
|
local linters = {
|
2023-09-19 05:21:43 +00:00
|
|
|
eslint = {
|
|
|
|
sourceName = "eslint",
|
|
|
|
-- fallback to global eslint if the local is not found?
|
|
|
|
-- https://github.com/creativenull/diagnosticls-configs-nvim/blob/e7d6f7e99f6b416d2aeee89314bc46fc36df7b22/lua/diagnosticls-configs/fs.lua#L20
|
|
|
|
command = "./node_modules/.bin/eslint",
|
|
|
|
rootPatterns = { ".eslintrc", ".eslintrc.js" },
|
|
|
|
debounce = 100,
|
|
|
|
args = { "--stdin", "--stdin-filename", "%filepath", "--format", "json" },
|
|
|
|
parseJson = {
|
|
|
|
errorsRoot = "[0].messages",
|
|
|
|
line = "line",
|
|
|
|
column = "column",
|
|
|
|
endLine = "endLine",
|
|
|
|
endColumn = "endColumn",
|
|
|
|
message = "${message} [${ruleId}]",
|
|
|
|
security = "severity",
|
|
|
|
},
|
|
|
|
securities = { [1] = "error", [2] = "warning" },
|
|
|
|
},
|
2023-09-19 04:51:33 +00:00
|
|
|
}
|
|
|
|
|
2023-09-19 05:21:43 +00:00
|
|
|
nvim_lsp.diagnosticls.setup({
|
|
|
|
on_attach = on_attach,
|
|
|
|
filetypes = vim.tbl_keys(filetypes),
|
|
|
|
init_options = {
|
|
|
|
linters = linters,
|
|
|
|
filetypes = filetypes,
|
|
|
|
},
|
|
|
|
})
|
2023-09-19 04:51:33 +00:00
|
|
|
|
|
|
|
-- Lua
|
|
|
|
|
2023-09-19 05:21:43 +00:00
|
|
|
local lua_ls_root_path = os.getenv("HOME") .. "/dev/lua-language-server"
|
|
|
|
local lua_ls_binary = lua_ls_root_path .. "/bin/lua-language-server"
|
2023-09-19 04:51:33 +00:00
|
|
|
|
2023-09-19 05:21:43 +00:00
|
|
|
local runtime_path = vim.split(package.path, ";")
|
2023-09-19 04:51:33 +00:00
|
|
|
table.insert(runtime_path, "lua/?.lua")
|
|
|
|
table.insert(runtime_path, "lua/?/init.lua")
|
|
|
|
|
2023-09-19 05:21:43 +00:00
|
|
|
nvim_lsp.lua_ls.setup({
|
|
|
|
cmd = { lua_ls_binary, "-E", lua_ls_root_path .. "/main.lua" },
|
|
|
|
settings = {
|
|
|
|
Lua = {
|
|
|
|
runtime = {
|
|
|
|
version = "LuaJIT",
|
|
|
|
path = runtime_path,
|
|
|
|
},
|
|
|
|
diagnostics = {
|
|
|
|
globals = { "vim" },
|
|
|
|
},
|
|
|
|
workspace = {
|
|
|
|
library = vim.api.nvim_get_runtime_file("", true),
|
|
|
|
},
|
|
|
|
telemetry = {
|
|
|
|
enable = false,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
on_attach = on_attach,
|
|
|
|
})
|