Skip to main

AK#Notes

NeoVim Termdebug Config

For init.lua file:

.lua
-- Debugger ===================================================================

vim.api.nvim_create_autocmd("CmdlineEnter", {
    callback = function()
        local cmd = vim.fn.getcmdline()
        if vim.fn.exists(":Termdebug") == 0 then
            vim.cmd("packadd termdebug")
        end
    end,
})

vim.g.termdebug_config = {
    disasm_window = true,
    variables_window = true,
    wide = 10,
    disasm_window = 15,
    variables_window = 15,
    command = {
        "gdb", "-nx",
        "-ex", "set breakpoint pending on",
        "-ex", "set disassembly-flavor intel",
        "-ex", "set confirm off",
        "-ex", "set print pretty on",
    }
}
local termdebug_keys = {
    { "n", "<leader>dr",  ":call TermDebugSendCommand('run')<CR>",      "[d]ebugger [r]un" },
    { "n", "<leader>dc",  ":call TermDebugSendCommand('continue')<CR>", "[d]ebugger [c]ontinue" },
    { "n", "<leader>de",  ":call TermDebugSendCommand('exit')<CR>",     "[d]ebugger [e]xit" },
    { "n", "<leader>dk",  ":call TermDebugSendCommand('kill')<CR>",     "[d]ebugger [k]ill" },
    { "n", "<leader>db",  ":Break<CR>",                                 "[d]ebugger [b]reakpoint" },
    { "n", "<leader>du",  ":Clear<CR>",                                 "[d]ebugger [u]nbreakpoint" },
    { "n", "<leader>dt",  ":Tbreak<CR>",                                "[d]ebugger [t]reak" },
    { "n", "<leader>dc",  ":Continue<CR>",                              "[d]ebugger [c]ontinue" },
    { "n", "<leader>dgg", ":Gdb<CR>",                                   "[d]ebugger [g]oto [g]db" },
    { "n", "<leader>dgp", ":Program<CR>",                               "[d]ebugger [g]oto [p]rogram" },
    { "n", "<leader>dgs", ":Source<CR>",                                "[d]ebugger [g]oto [s]ource" },
    { "n", "<leader>dga", ":Asm<CR>",                                   "[d]ebugger [g]oto [a]ssembly" },
    { "n", "<leader>dgl", ":Var<CR>",                                   "[d]ebugger [g]oto [l]ocal watchlist" },
    { "n", "<F1>",        ":Over<CR>",                                  "Debugger Next" },
    { "n", "<F2>",        ":Step<CR>",                                  "Debugger Step" },
    { "n", "=",           ":Up<CR>",                                    "Debugger go Up frame" },
}
local current_debug_edit_file=""
vim.api.nvim_create_autocmd("User", {
    pattern = "TermdebugStartPre",
    callback = function()
        for _, k in ipairs(termdebug_keys) do
            keymap_set(k[1], k[2], k[3], k[4])
        end
        current_debug_edit_file=vim.api.nvim_buf_get_name(0)
        vim.cmd.tabnew()
    end,
})
vim.api.nvim_create_autocmd("User", {
    pattern = "TermdebugStartPost",
    callback = function()
        vim.cmd("Gdb")
        vim.cmd("wincmd K")
        vim.cmd("Source")
        vim.cmd.edit(current_debug_edit_file)
        vim.cmd("wincmd K")
        vim.cmd.resize(30)
        vim.cmd("Program")
        vim.cmd.resize(15)
        vim.cmd("Asm")
        vim.cmd.resize(6)
        vim.cmd("Source")
    end,
})
vim.api.nvim_create_autocmd("User", {
    pattern = "TermdebugStopPre",
    callback = function()
        vim.cmd("Source")
        current_debug_edit_file=vim.api.nvim_buf_get_name(0)
        vim.cmd("Gdb")
        vim.cmd("Bd")
    end,
})
vim.api.nvim_create_autocmd("User", {
    pattern = "TermdebugStopPost",
    callback = function()
        for _, k in ipairs(termdebug_keys) do
            pcall(vim.keymap.del, k[1], k[2])
        end
        vim.cmd.tabclose()
        vim.cmd.edit(current_debug_edit_file)
    end,
})

For .nvim.lua file

.lua
-- ak: Setup Termdebug
-- ============================================================================

local program_name_debug = build_dir.."/cope_debug"
local termdebug_config = vim.g.termdebug_config or {}
termdebug_config.command = {
    "gdb", "-nx",
    "-ex", "set breakpoint pending on",
    "-ex", "set disassembly-flavor intel",
    "-ex", "set confirm off",
    "-ex", "set print pretty on",
    program_name_debug
}
vim.g.termdebug_config = termdebug_config

vim.api.nvim_create_autocmd("User", {
    pattern = "TermdebugStartPost",
    callback = function()
        vim.keymap.set("n", "<leader>dr", ":call TermDebugSendCommand('dr')<CR>", { desc = "[d]ebugger [r]un" })
        vim.cmd('cexpr system("' .. cc_command .. 'build-debugger --nocolor")')
        vim.fn.TermDebugSendCommand('define dr')
        vim.fn.TermDebugSendCommand('   shell '..cc_command.."build-debugger")
        vim.fn.TermDebugSendCommand('   file '..program_name_debug)
        vim.fn.TermDebugSendCommand('   run')
        vim.fn.TermDebugSendCommand('end')
    end,
})