Files
dotfiles/nvim/lua/config/lsp.lua

110 lines
2.6 KiB
Lua

local cmp = require("cmp")
local luasnip = require("luasnip")
cmp.setup({
snippet = {
expand = function(args)
luasnip.lsp_expand(args.body)
end,
},
mapping = cmp.mapping.preset.insert({
["<C-space>"] = cmp.mapping.complete(),
["<CR>"] = cmp.mapping.confirm({ select = true }),
}),
sources = {
{ name = "nvim_lsp" },
{ name = "luasnip" },
}
})
local caps = require("cmp_nvim_lsp").default_capabilities()
local on_attach = function(client, bufnr)
local opts = { noremap=true, silent=true, buffer=bufnr }
vim.keymap.set("n", "gd", vim.lsp.buf.definition, opts)
vim.keymap.set("n", "K", vim.lsp.buf.hover, opts)
end
vim.filetype.add({
extension = {
cu = "cuda",
cuh = "cuda",
},
})
-- rust-analyzer
vim.lsp.config("rust_analyzer", {
settings = {
["rust-analyzer"] = {
inlayHints = {
parameterHints = { enable = true },
typeHints = { enable = true },
},
},
},
capabilities = caps,
on_attach = on_attach,
})
vim.lsp.enable("rust_analyzer")
-- typescript
vim.lsp.config("ts_ls", {
capabilities = caps,
on_attach = on_attach,
filetypes = { "javascript", "javascriptreact", "typescript", "typescriptreact", "typescript.tsx" },
cmd = { "typescript-language-server", "--stdio" },
})
vim.lsp.enable("ts_ls")
-- gopls
vim.lsp.config("gopls", {
settings = {
gopls = {
gofumpt = true,
staticcheck = true,
},
},
capabilities = caps,
on_attach = on_attach,
})
vim.lsp.enable("gopls")
-- pyright
vim.lsp.config("pyright", {
capabilities = caps,
})
vim.api.nvim_create_autocmd("BufWritePre", {
group = vim.api.nvim_create_augroup("AutoFormatOnSave", { clear = true }),
pattern = "*",
callback = function()
local ext = vim.fn.expand("%:e")
local cpp_exts = { cpp = true, cxx = true, hpp = true, ixx = true }
if cpp_exts[ext] then
local lines = vim.api.nvim_buf_get_lines(0, 0, -1, false)
local input = table.concat(lines, "\n")
-- pass buffer content via stdin, get formatted output back
local result = vim.fn.systemlist(
{ "clang-format", "--assume-filename=" .. vim.fn.expand("%:t") },
input
)
if vim.v.shell_error == 0 then
vim.api.nvim_buf_set_lines(0, 0, -1, false, result)
else
vim.notify("clang-format failed: " .. table.concat(result, "\n"), vim.log.levels.WARN)
end
return
end
for _, client in pairs(vim.lsp.get_active_clients({ bufnr = 0 })) do
if client.supports_method("textDocument/formatting") then
vim.lsp.buf.format({ async = false, timeout_ms = 5000 })
return
end
end
end,
})