0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 9.1.1756: termdebug: Need a few more user commands

Problem:  termdebug: Need a few more user commands
Solution: Add the :RunOrContinue and the :ToggleBreak user commands
          (bennyyip)

closes: #18283

Signed-off-by: bennyyip <yebenmy@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
bennyyip
2025-09-14 04:33:07 -04:00
committed by Christian Brabandt
parent c37f25c651
commit c975d62473
5 changed files with 122 additions and 3 deletions

View File

@@ -2212,6 +2212,7 @@ $quote eval.txt /*$quote*
:Rexplore pi_netrw.txt /*:Rexplore* :Rexplore pi_netrw.txt /*:Rexplore*
:RmVimball pi_vimball.txt /*:RmVimball* :RmVimball pi_vimball.txt /*:RmVimball*
:Run terminal.txt /*:Run* :Run terminal.txt /*:Run*
:RunOrContinue terminal.txt /*:RunOrContinue*
:RustEmitAsm ft_rust.txt /*:RustEmitAsm* :RustEmitAsm ft_rust.txt /*:RustEmitAsm*
:RustEmitIr ft_rust.txt /*:RustEmitIr* :RustEmitIr ft_rust.txt /*:RustEmitIr*
:RustExpand ft_rust.txt /*:RustExpand* :RustExpand ft_rust.txt /*:RustExpand*
@@ -2233,6 +2234,7 @@ $quote eval.txt /*$quote*
:Termdebug terminal.txt /*:Termdebug* :Termdebug terminal.txt /*:Termdebug*
:TermdebugCommand terminal.txt /*:TermdebugCommand* :TermdebugCommand terminal.txt /*:TermdebugCommand*
:Texplore pi_netrw.txt /*:Texplore* :Texplore pi_netrw.txt /*:Texplore*
:ToggleBreak terminal.txt /*:ToggleBreak*
:Tutor pi_tutor.txt /*:Tutor* :Tutor pi_tutor.txt /*:Tutor*
:URLOpen eval.txt /*:URLOpen* :URLOpen eval.txt /*:URLOpen*
:Until terminal.txt /*:Until* :Until terminal.txt /*:Until*

View File

@@ -1,4 +1,4 @@
*terminal.txt* For Vim version 9.1. Last change: 2025 Sep 02 *terminal.txt* For Vim version 9.1. Last change: 2025 Sep 14
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@@ -1427,12 +1427,16 @@ gdb:
:Tbreak {position} :Tbreak {position}
set a temporary breakpoint at the specified position set a temporary breakpoint at the specified position
*:Clear* delete the breakpoint at the cursor position *:Clear* delete the breakpoint at the cursor position
*:ToggleBreak* set a breakpoint at the cursor position or delete all
breakpoints at the cursor positoin
*:Step* execute the gdb "step" command *:Step* execute the gdb "step" command
*:Over* execute the gdb "next" command (`:Next` is a Vim command) *:Over* execute the gdb "next" command (`:Next` is a Vim command)
*:Until* execute the gdb "until" command *:Until* execute the gdb "until" command
*:Finish* execute the gdb "finish" command *:Finish* execute the gdb "finish" command
*:Continue* execute the gdb "continue" command *:Continue* execute the gdb "continue" command
*:RunOrContinue* execute the gdb "continue" command if program is running,
otherwise run the program
*:Stop* interrupt the program *:Stop* interrupt the program
If 'mouse' is set the plugin adds a window toolbar with these entries: If 'mouse' is set the plugin adds a window toolbar with these entries:

View File

@@ -4,7 +4,7 @@ vim9script
# Author: Bram Moolenaar # Author: Bram Moolenaar
# Copyright: Vim license applies, see ":help license" # Copyright: Vim license applies, see ":help license"
# Last Change: 2025 Sep 02 # Last Change: 2025 Sep 14
# Converted to Vim9: Ubaldo Tiberi <ubaldo.tiberi@gmail.com> # Converted to Vim9: Ubaldo Tiberi <ubaldo.tiberi@gmail.com>
# WORK IN PROGRESS - The basics works stable, more to come # WORK IN PROGRESS - The basics works stable, more to come
@@ -1173,6 +1173,7 @@ def InstallCommands()
command -nargs=? Break SetBreakpoint(<q-args>) command -nargs=? Break SetBreakpoint(<q-args>)
command -nargs=? Tbreak SetBreakpoint(<q-args>, true) command -nargs=? Tbreak SetBreakpoint(<q-args>, true)
command ToggleBreak ToggleBreak()
command Clear ClearBreakpoint() command Clear ClearBreakpoint()
command Step SendResumingCommand('-exec-step') command Step SendResumingCommand('-exec-step')
command Over SendResumingCommand('-exec-next') command Over SendResumingCommand('-exec-next')
@@ -1182,6 +1183,7 @@ def InstallCommands()
command -nargs=* Arguments SendResumingCommand('-exec-arguments ' .. <q-args>) command -nargs=* Arguments SendResumingCommand('-exec-arguments ' .. <q-args>)
command Stop StopCommand() command Stop StopCommand()
command Continue ContinueCommand() command Continue ContinueCommand()
command RunOrContinue RunOrContinue()
command -nargs=* Frame Frame(<q-args>) command -nargs=* Frame Frame(<q-args>)
command -count=1 Up Up(<count>) command -count=1 Up Up(<count>)
@@ -1296,6 +1298,8 @@ def DeleteCommands()
delcommand Asm delcommand Asm
delcommand Var delcommand Var
delcommand Winbar delcommand Winbar
delcommand RunOrContinue
delcommand ToggleBreak
if !empty(saved_K_map) && !saved_K_map.buffer if !empty(saved_K_map) && !saved_K_map.buffer
@@ -1439,6 +1443,19 @@ def ClearBreakpoint()
endif endif
enddef enddef
def ToggleBreak()
var fname = fnameescape(expand('%:p'))
var lnum = line('.')
var bploc = printf('%s:%d', fname, lnum)
if has_key(breakpoint_locations, bploc)
while has_key(breakpoint_locations, bploc)
ClearBreakpoint()
endwhile
else
SetBreakpoint("")
endif
enddef
def Run(args: string) def Run(args: string)
if args != '' if args != ''
SendResumingCommand($'-exec-arguments {args}') SendResumingCommand($'-exec-arguments {args}')
@@ -1446,6 +1463,14 @@ def Run(args: string)
SendResumingCommand('-exec-run') SendResumingCommand('-exec-run')
enddef enddef
def RunOrContinue()
if running
ContinueCommand()
else
Run('')
endif
enddef
# :Frame - go to a specific frame in the stack # :Frame - go to a specific frame in the stack
def Frame(arg: string) def Frame(arg: string)
# Note: we explicit do not use mi's command # Note: we explicit do not use mi's command
@@ -2004,7 +2029,10 @@ def HandleNewBreakpoint(msg: string, modifiedFlag: bool)
if !has_key(breakpoint_locations, bploc) if !has_key(breakpoint_locations, bploc)
breakpoint_locations[bploc] = [] breakpoint_locations[bploc] = []
endif endif
if breakpoint_locations[bploc]->index(id) == -1
# Make sure all ids are unique
breakpoint_locations[bploc] += [id] breakpoint_locations[bploc] += [id]
endif
var posMsg = '' var posMsg = ''
if bufloaded(fname) if bufloaded(fname)

View File

@@ -606,4 +606,87 @@ function Test_termdebug_config_types()
unlet g:termdebug_config unlet g:termdebug_config
endfunction endfunction
func Test_termdebug_toggle_break()
let g:test_is_flaky = 1
let bin_name = 'XTD_tbreak'
let src_name = bin_name .. '.c'
eval s:generate_files(bin_name)
execute 'edit ' .. src_name
execute 'Termdebug ./' .. bin_name
call WaitForAssert({-> assert_true(get(g:, "termdebug_is_running", v:false))})
call WaitForAssert({-> assert_equal(3, winnr('$'))})
let gdb_buf = winbufnr(1)
wincmd b
let bp_line = 22 " 'return' statement in main
execute "normal! " .. bp_line .. "G"
execute "ToggleBreak"
call term_wait(gdb_buf)
redraw!
call assert_equal([
\ {'lnum': bp_line, 'id': 1014, 'name': 'debugBreakpoint1.0',
\ 'priority': 110, 'group': 'TermDebug'}],
\ sign_getplaced('', #{group: 'TermDebug'})[0].signs)
RunOrContinue
call term_wait(gdb_buf, 400)
redraw!
call WaitForAssert({-> assert_equal([
\ {'lnum': bp_line, 'id': 12, 'name': 'debugPC', 'priority': 110,
\ 'group': 'TermDebug'},
\ {'lnum': bp_line, 'id': 1014, 'name': 'debugBreakpoint1.0',
\ 'priority': 110, 'group': 'TermDebug'}],
\ sign_getplaced('', #{group: 'TermDebug'})[0].signs)})
" Add one break point
execute "normal! " .. bp_line .. "G"
execute "ToggleBreak"
call term_wait(gdb_buf)
redraw!
call WaitForAssert({-> assert_equal([
\ {'lnum': bp_line, 'id': 12, 'name': 'debugPC', 'priority': 110,
\ 'group': 'TermDebug'}],
\ sign_getplaced('', #{group: 'TermDebug'})[0].signs)})
" Remove one break point
execute "normal! " .. bp_line .. "G"
execute "ToggleBreak"
call term_wait(gdb_buf)
redraw!
call WaitForAssert({-> assert_equal([
\ {'lnum': bp_line, 'id': 2014, 'name': 'debugBreakpoint2.0',
\ 'priority': 110, 'group': 'TermDebug'},
\ {'lnum': bp_line, 'id': 12, 'name': 'debugPC', 'priority': 110,
\ 'group': 'TermDebug'}],
\ sign_getplaced('', #{group: 'TermDebug'})[0].signs)})
" Remove multiple break points
execute "Break"
execute "Break"
execute "Break"
execute "Break"
call term_wait(gdb_buf, 400)
execute "ToggleBreak"
call term_wait(gdb_buf)
redraw!
call WaitForAssert({-> assert_equal([
\ {'lnum': bp_line, 'id': 12, 'name': 'debugPC', 'priority': 110,
\ 'group': 'TermDebug'}],
\ sign_getplaced('', #{group: 'TermDebug'})[0].signs)})
wincmd t
quit!
redraw!
call WaitForAssert({-> assert_equal(1, winnr('$'))})
call assert_equal([], sign_getplaced('', #{group: 'TermDebug'})[0].signs)
eval s:cleanup_files(bin_name)
%bw!
endfunc
" vim: shiftwidth=2 sts=2 expandtab " vim: shiftwidth=2 sts=2 expandtab

View File

@@ -724,6 +724,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1756,
/**/ /**/
1755, 1755,
/**/ /**/