diff --git a/lua/kickstart/plugins/debug.lua b/lua/kickstart/plugins/debug.lua index 8e332bf2..05ad377d 100644 --- a/lua/kickstart/plugins/debug.lua +++ b/lua/kickstart/plugins/debug.lua @@ -64,9 +64,72 @@ return { { 'B', function() - require('dap').set_breakpoint(vim.fn.input 'Breakpoint condition: ') + local dap = require 'dap' + + -- Search for an existing breakpoint on this line in this buffer + ---@return dap.SourceBreakpoint bp that was either found, or an empty placeholder + local function find_bp() + local buf_bps = require('dap.breakpoints').get(vim.fn.bufnr())[vim.fn.bufnr()] + ---@type dap.SourceBreakpoint + for _, candidate in ipairs(buf_bps) do + if candidate.line and candidate.line == vim.fn.line '.' then + return candidate + end + end + + return { condition = '', logMessage = '', hitCondition = '', line = vim.fn.line '.' } + end + + -- Elicit customization via a UI prompt + ---@param bp dap.SourceBreakpoint a breakpoint + local function customize_bp(bp) + local props = { + ['Condition'] = { + value = bp.condition, + setter = function(v) + bp.condition = v + end, + }, + ['Hit Condition'] = { + value = bp.hitCondition, + setter = function(v) + bp.hitCondition = v + end, + }, + ['Log Message'] = { + value = bp.logMessage, + setter = function(v) + bp.logMessage = v + end, + }, + } + local menu_options = {} + for k, _ in pairs(props) do + table.insert(menu_options, k) + end + vim.ui.select(menu_options, { + prompt = 'Edit Breakpoint', + format_item = function(item) + return ('%s: %s'):format(item, props[item].value) + end, + }, function(choice) + if choice == nil then + -- User cancelled the selection + return + end + props[choice].setter(vim.fn.input { + prompt = ('[%s] '):format(choice), + default = props[choice].value, + }) + + -- Set breakpoint for current line, with customizations (see h:dap.set_breakpoint()) + dap.set_breakpoint(bp.condition, bp.hitCondition, bp.logMessage) + end) + end + + customize_bp(find_bp()) end, - desc = 'Debug: Set Breakpoint', + desc = 'Debug: Edit Breakpoint', }, -- Toggle to see last session result. Without this, you can't see session output in case of unhandled exception. {