太棒了!正如我们之前讨论的,对于 Zig 这种编译型系统级语言,想要进行断点调试、单步执行和查看内存,引入 nvim-dap 搭配 codelldb 是最完美的终极方案。

要在 NvChad 中打造这个 IDE 级别的调试体验,我们需要完成插件安装、调试器配置以及按键绑定。以下是为你量身定制的完整配置流:

🛠️ 第一步:通过 Mason 安装核心调试器 (codelldb)

我们不需要去系统里折腾安装包,直接利用 Neovim 的生态:

  1. 在 Nvim 中输入 :Mason

  2. / 搜索 codelldb

  3. 光标移上去按下 i 进行安装。

🧩 第二步:引入 DAP 和 DAP-UI 插件

打开你的 lua/plugins/init.lua,在返回的列表中追加 nvim-dap(调试核心引擎)和 nvim-dap-ui(提供类似 IDE 的可视化调试面板):

Lua

  -- [代码调试 DAP]
  {
    "mfussenegger/nvim-dap",
    config = function()
      -- 我们将在独立的 dap.lua 文件中配置它
      require "configs.dap"
    end,
  },
  {
    "rcarriga/nvim-dap-ui",
    -- dap-ui 需要 nvim-nio 作为异步依赖
    dependencies = { "mfussenegger/nvim-dap", "nvim-neotest/nvim-nio" },
    config = function()
      require("dapui").setup()
    end,
  },

⚙️ 第三步:配置 codelldb 适配器与 Zig 启动项

在你的 lua/configs/ 目录下新建一个文件 dap.lua。我们将在这里告诉 DAP 如何调用刚才下载的 codelldb,以及遇到 Zig 文件时该怎么做:

Lua

local dap = require("dap")

-- 1. 注册 codelldb 调试适配器
dap.adapters.codelldb = {
  type = "server",
  port = "${port}",
  executable = {
    -- 动态获取 Mason 安装的 codelldb 路径
    command = vim.fn.stdpath("data") .. "/mason/bin/codelldb",
    args = { "--port", "${port}" },
  },
}

-- 2. 为 Zig 语言配置调试启动参数
dap.configurations.zig = {
  {
    name = "Launch Zig binary (codelldb)",
    type = "codelldb",
    request = "launch",
    program = function()
      -- 每次启动调试时,弹窗让你确认要调试的二进制文件路径
      return vim.fn.input("Path to executable: ", vim.fn.getcwd() .. "/", "file")
    end,
    cwd = "${workspaceFolder}",
    stopOnEntry = false,
    args = {},
  },
}

⌨️ 第四步:绑定灵魂快捷键

打开 lua/mappings.lua,为 DAP 添加一组顺手的快捷键(通常以 <leader>d 开头,代表 Debug):

Lua

local map = vim.keymap.set

-- DAP 调试核心按键
map("n", "<leader>db", "<cmd>DapToggleBreakpoint<CR>", { desc = "Debug: Toggle Breakpoint (打断点)" })
map("n", "<leader>dc", "<cmd>DapContinue<CR>", { desc = "Debug: Start/Continue (启动/继续运行)" })
map("n", "<leader>do", "<cmd>DapStepOver<CR>", { desc = "Debug: Step Over (单步跳过)" })
map("n", "<leader>di", "<cmd>DapStepInto<CR>", { desc = "Debug: Step Into (单步步入)" })

-- 开关可视化调试面板 (查看变量、内存、堆栈)
map("n", "<leader>du", function()
  require("dapui").toggle()
end, { desc = "Debug: Toggle UI Panel" })

🚀 终极实战:编译、运行与调试工作流

配置完成并重启 Nvim 后,你的 Zig 调试工作流将是这样的:

1. 编译并生成带调试信息的二进制文件

Zig 是编译型语言,调试器不能直接运行 .zig 源码,它需要一个可执行文件。

  • 呼出你的浮动终端(之前配置的 <A-t><C-\>)。

  • 编译代码(保留 Debug 符号):zig build-exe hello.zig -O Debug

  • (如果是完整的 Zig 项目,通常运行 zig build 即可生成在 zig-out/bin/ 下)

2. 打断点

回到 hello.zig 的代码中,将光标移动到你想暂停的那一行,按下 <leader>db。行号旁边会出现一个显眼的红色断点标志 B

3. 启动调试与查看内存

  • 按下 <leader>dc 启动调试。

  • 此时底部会弹出输入框 Path to executable: ...,输入你刚才编译出的程序名称(例如 hellozig-out/bin/hello)并回车。

  • 按下 <leader>du 呼出 DAP-UI 面板。

此时,代码会精准停在你的断点处。左侧面板会清晰地展示当前的局部变量寄存器状态和内存监控,你可以继续用 <leader>do (下一步) 来逐行观察你的 Zig 程序是如何啃内存的了!