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({ [""] = cmp.mapping.complete(), [""] = 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, })