-- English comments only. -- ========================= -- Formatting (Conform) -- ========================= local ok_conform, conform = pcall(require, "conform") if ok_conform then conform.setup({ formatters_by_ft = { rust = { "rustfmt" }, }, format_on_save = function(_) return { timeout_ms = 2000, lsp_fallback = true } end, }) end vim.keymap.set("n", "rf", function() if ok_conform then conform.format({ timeout_ms = 2000, lsp_fallback = true }) else vim.lsp.buf.format({ async = true }) end end, { desc = "Rust format" }) -- ========================= -- Cargo -> Quickfix -- ========================= local function cargo_to_quickfix(cmd) local output = vim.fn.systemlist(cmd) vim.fn.setqflist({}, " ", { title = cmd, lines = output }) vim.cmd("copen") end vim.keymap.set("n", "rr", function() cargo_to_quickfix("cargo run") end, { desc = "Cargo run (quickfix)" }) vim.keymap.set("n", "rt", function() cargo_to_quickfix("cargo test") end, { desc = "Cargo test (quickfix)" }) vim.keymap.set("n", "rc", function() cargo_to_quickfix("cargo check") end, { desc = "Cargo check (quickfix)" }) vim.keymap.set("n", "rl", function() cargo_to_quickfix("cargo clippy") end, { desc = "Cargo clippy (quickfix)" }) vim.keymap.set("n", "rb", function() cargo_to_quickfix("cargo build") end, { desc = "Cargo build (quickfix)" }) -- ========================= -- DAP (Rust adapter + configurations) -- ========================= local ok_dap, dap = pcall(require, "dap") if not ok_dap then return end local function rust_default_binary() -- Try to read package name from Cargo.toml (common single-crate case). local cargo_toml = vim.fn.getcwd() .. "/Cargo.toml" if vim.fn.filereadable(cargo_toml) == 1 then for _, line in ipairs(vim.fn.readfile(cargo_toml)) do local name = line:match('^name%s*=%s*"(.-)"') if name then return vim.fn.getcwd() .. "/target/debug/" .. name end end end return vim.fn.getcwd() .. "/target/debug/" end -- codelldb adapter (installed via Mason) local mason_path = vim.fn.stdpath("data") .. "/mason" local codelldb_path = mason_path .. "/packages/codelldb/extension/adapter/codelldb" dap.adapters.codelldb = { type = "server", port = "${port}", executable = { command = codelldb_path, args = { "--port", "${port}" }, }, } dap.configurations.rust = { { name = "Debug (default binary)", type = "codelldb", request = "launch", program = function() local default_path = rust_default_binary() return vim.fn.input("Path to executable: ", default_path, "file") end, cwd = "${workspaceFolder}", stopOnEntry = false, }, { name = "Debug tests (cargo test)", type = "codelldb", request = "launch", -- This runs the test binary; you'll pick it once, then you can use dl (run last). program = function() -- Tip: run `cargo test --no-run` once, then pick the produced test binary. local default_path = vim.fn.getcwd() .. "/target/debug/deps/" return vim.fn.input("Path to test executable: ", default_path, "file") end, cwd = "${workspaceFolder}", stopOnEntry = false, }, }