From 479cb6e4d9202200502124d2e9b433bad147330c Mon Sep 17 00:00:00 2001 From: Brian Lehrer <661570+blehrer@users.noreply.github.com> Date: Tue, 13 May 2025 01:46:02 -0700 Subject: [PATCH 1/3] feat: Enhances breakpoint editing The keymapping `B` is now configured to guide users through the process of adding a `condition`, `hitCondition`, and `logMessage` to a breakpoint. --- lua/kickstart/plugins/debug.lua | 53 +++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/lua/kickstart/plugins/debug.lua b/lua/kickstart/plugins/debug.lua index 753cb0ce..ec5ff5a1 100644 --- a/lua/kickstart/plugins/debug.lua +++ b/lua/kickstart/plugins/debug.lua @@ -64,9 +64,58 @@ return { { 'B', function() - require('dap').set_breakpoint(vim.fn.input 'Breakpoint condition: ') + local dap = require 'dap' + -- Search for an existing breakpoing 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 + local bp = { condition = '', logMessage = '', hitCondition = '', line = vim.fn.line '.' } + for _, candidate in ipairs(buf_bps) do + if candidate.line and candidate.line == vim.fn.line '.' then + bp = candidate + break + end + end + return bp + end + + -- Elicit customization via a UI prompt + ---@param bp dap.SourceBreakpoint a breakpoint + local function customize_bp(bp) + local fields = { + ('Condition: (%s)\n'):format(bp.condition), + ('Hit Condition: (%s)\n'):format(bp.hitCondition), + ('Log Message: (%s)\n'):format(bp.logMessage), + } + vim.ui.select(fields, { + prompt = 'Edit breakpoint', + }, function(choice) + if choice == fields[1] then + bp.condition = vim.fn.input { + prompt = 'Condition: ', + default = bp.condition, + } + elseif choice == fields[2] then + bp.hitCondition = vim.fn.input { + prompt = 'Hit Condition: ', + default = bp.hitCondition, + } + elseif choice == fields[3] then + bp.logMessage = vim.fn.input { + prompt = 'Log Message: ', + default = bp.logMessage, + } + end + + -- 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. { From 87fe216eebab0780feb190a8fb935661d1847499 Mon Sep 17 00:00:00 2001 From: Brian Lehrer <661570+blehrer@users.noreply.github.com> Date: Tue, 13 May 2025 19:13:41 -0700 Subject: [PATCH 2/3] refactor to use no magic numbers --- init.lua | 2 +- lua/kickstart/plugins/debug.lua | 55 +++++++++++++++++++-------------- 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/init.lua b/init.lua index b98ffc61..871396b8 100644 --- a/init.lua +++ b/init.lua @@ -973,7 +973,7 @@ require('lazy').setup({ -- Here are some example plugins that I've included in the Kickstart repository. -- Uncomment any of the lines below to enable them (you will need to restart nvim). -- - -- require 'kickstart.plugins.debug', + require 'kickstart.plugins.debug', -- require 'kickstart.plugins.indent_line', -- require 'kickstart.plugins.lint', -- require 'kickstart.plugins.autopairs', diff --git a/lua/kickstart/plugins/debug.lua b/lua/kickstart/plugins/debug.lua index ec5ff5a1..55c5ee1d 100644 --- a/lua/kickstart/plugins/debug.lua +++ b/lua/kickstart/plugins/debug.lua @@ -64,8 +64,9 @@ return { { 'B', function() + require 'dap.protocol' local dap = require 'dap' - -- Search for an existing breakpoing on this line in this buffer + -- 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()] @@ -83,30 +84,38 @@ return { -- Elicit customization via a UI prompt ---@param bp dap.SourceBreakpoint a breakpoint local function customize_bp(bp) - local fields = { - ('Condition: (%s)\n'):format(bp.condition), - ('Hit Condition: (%s)\n'):format(bp.hitCondition), - ('Log Message: (%s)\n'):format(bp.logMessage), + 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, + }, } - vim.ui.select(fields, { - prompt = 'Edit breakpoint', + local menu_options = {} + for k, v in pairs(props) do + table.insert(menu_options, ('%s: %s'):format(k, v.value)) + end + vim.ui.select(menu_options, { + prompt = 'Edit Breakpoint', }, function(choice) - if choice == fields[1] then - bp.condition = vim.fn.input { - prompt = 'Condition: ', - default = bp.condition, - } - elseif choice == fields[2] then - bp.hitCondition = vim.fn.input { - prompt = 'Hit Condition: ', - default = bp.hitCondition, - } - elseif choice == fields[3] then - bp.logMessage = vim.fn.input { - prompt = 'Log Message: ', - default = bp.logMessage, - } - end + local prompt = (tostring(choice)):gsub(':.*', '') + props[prompt].setter(vim.fn.input { + prompt = ('[%s] '):format(prompt), + default = props[prompt].value, + }) -- Set breakpoint for current line, with customizations (see h:dap.set_breakpoint()) dap.set_breakpoint(bp.condition, bp.hitCondition, bp.logMessage) From 8bd125f45a61b4e724d534da1349c20afb63598a Mon Sep 17 00:00:00 2001 From: Brian Lehrer <661570+blehrer@users.noreply.github.com> Date: Wed, 14 May 2025 03:03:10 -0700 Subject: [PATCH 3/3] revert testing change --- init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.lua b/init.lua index 871396b8..b98ffc61 100644 --- a/init.lua +++ b/init.lua @@ -973,7 +973,7 @@ require('lazy').setup({ -- Here are some example plugins that I've included in the Kickstart repository. -- Uncomment any of the lines below to enable them (you will need to restart nvim). -- - require 'kickstart.plugins.debug', + -- require 'kickstart.plugins.debug', -- require 'kickstart.plugins.indent_line', -- require 'kickstart.plugins.lint', -- require 'kickstart.plugins.autopairs',