-- Debug Adapter Protocol (DAP) configuration for Go & JS -- Uses delve for Go debugging -- Loads only when a d* key is pressed (see keys = {...} below). return { -- ───────────────────────────────────────────────────────────────────────── -- Core DAP + Go adapter + UI extras -- ───────────────────────────────────────────────────────────────────────── { "mfussenegger/nvim-dap", dependencies = { -- Fold these under nvim-dap so they share its keys-based lazy trigger -- instead of loading eagerly at startup. { "rcarriga/nvim-dap-ui", dependencies = { "nvim-neotest/nvim-nio" } }, "theHamsta/nvim-dap-virtual-text", "jay-babu/mason-nvim-dap.nvim", { "leoluz/nvim-dap-go", -- IMPORTANT: opts is a FUNCTION, not a table literal. -- The attach config references require("dap.utils"), which must not run until -- nvim-dap is actually loaded. opts = function() return { delve = { path = "dlv", initialize_timeout_sec = 20, port = "${port}", build_flags = "", }, dap_configurations = { { type = "go", name = "Debug", request = "launch", program = "${file}" }, { type = "go", name = "Debug Test", request = "launch", program = "${file}" }, { type = "go", name = "Debug Package", request = "launch", program = "${filDirname}" }, { type = "go", name = "Debug test (go.mod)", request = "launch", mode = "test", program = "./${relativeFileDirname}", }, { type = "go", name = "Attach", request = "attach", mode = "local", processId = require("dap.utils").pick_process, }, }, } end, }, }, keys = { { "dB", function() require("dap").set_breakpoint(vim.fn.input("Breakpoint condition: ")) end, desc = "Breakpoint Condition", }, { "db", function() require("dap").toggle_breakpoint() end, desc = "Toggle Breakpoint", }, { "dc", function() require("dap").continue() end, desc = "Continue", }, { "dC", function() require("dap").run_to_cursor() end, desc = "Run to Cursor", }, { "dg", function() require("dap").goto_() end, desc = "Go to Line (No Execute)", }, { "di", function() require("dap").step_into() end, desc = "Step Into", }, { "dj", function() require("dap").down() end, desc = "Down", }, { "dk", function() require("dap").up() end, desc = "Up", }, { "dO", function() require("dap").step_over() end, desc = "Step Over", }, { "dp", function() require("dap").pause() end, desc = "Pause", }, { "dr", function() require("dap").repl.toggle() end, desc = "Toggle REPL", }, { "ds", function() require("dap").session() end, desc = "Session", }, { "dt", function() require("dap").terminate() end, desc = "Terminate", }, { "dw", function() require("dap.ui.widgets").hover() end, desc = "Widgets", }, -- Go-specific { "dT", function() require("dap-go").debug_test() end, desc = "Debug Go Test", }, { "dL", function() require("dap-go").debug_last_test() end, desc = "Debug Last Go Test", }, }, }, -- ───────────────────────────────────────────────────────────────────────── -- DAP UI keymaps + auto open/close (the spec itself is loaded as a dep above) -- ───────────────────────────────────────────────────────────────────────── { "rcarriga/nvim-dap-ui", keys = { { "du", function() require("dapui").toggle({}) end, desc = "Dap UI", }, { "de", function() require("dapui").eval() end, desc = "Eval", mode = { "n", "v" }, }, }, opts = { layouts = { { elements = { { id = "scopes", size = 0.25 }, { id = "breakpoints", size = 0.25 }, { id = "stacks", size = 0.25 }, { id = "watches", size = 0.25 }, }, position = "left", size = 40, }, { elements = { { id = "repl", size = 0.5 }, { id = "console", size = 0.5 }, }, position = "bottom", size = 10, }, }, }, config = function(_, opts) local dap = require("dap") local dapui = require("dapui") dapui.setup(opts) -- Auto open/close DAP UI on debug session start/end dap.listeners.after.event_initialized["dapui_config"] = function() dapui.open({}) end dap.listeners.before.event_terminated["dapui_config"] = function() dapui.close({}) end dap.listeners.before.event_exited["dapui_config"] = function() dapui.close({}) end end, }, -- ───────────────────────────────────────────────────────────────────────── -- mason-nvim-dap: install DAP adapters via Mason -- ───────────────────────────────────────────────────────────────────────── -- Note: delve and js-debug-adapter are also listed in mason.lua's -- ensure_installed (under "DAP adapters"). Either source -- can install them; mason-nvim-dap is preferred when present because it also -- auto-registers the adapters with nvim-dap. { "jay-babu/mason-nvim-dap.nvim", opts = { ensure_installed = { "python", "delve", "js" }, }, }, -- ───────────────────────────────────────────────────────────────────────── -- Inline variable values during debug sessions -- ───────────────────────────────────────────────────────────────────────── { "theHamsta/nvim-dap-virtual-text", opts = { enabled = true, enabled_commands = true, highlight_changed_variables = true, highlight_new_as_changed = false, show_stop_reason = true, commented = false, only_first_definition = true, all_references = false, filter_references_pattern = "