]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.1756: termdebug: Need a few more user commands v9.1.1756
authorbennyyip <yebenmy@gmail.com>
Sun, 14 Sep 2025 08:33:07 +0000 (04:33 -0400)
committerChristian Brabandt <cb@256bit.org>
Sun, 14 Sep 2025 08:33:07 +0000 (04:33 -0400)
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>
runtime/doc/tags
runtime/doc/terminal.txt
runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
src/testdir/test_plugin_termdebug.vim
src/version.c

index b8acc9e5613283638f9a1bfeef98f2c32b6da74c..31f55bdb0f83e887cb1c1882493dcc04baca1462 100644 (file)
@@ -2212,6 +2212,7 @@ $quote    eval.txt        /*$quote*
 :Rexplore      pi_netrw.txt    /*:Rexplore*
 :RmVimball     pi_vimball.txt  /*:RmVimball*
 :Run   terminal.txt    /*:Run*
+:RunOrContinue terminal.txt    /*:RunOrContinue*
 :RustEmitAsm   ft_rust.txt     /*:RustEmitAsm*
 :RustEmitIr    ft_rust.txt     /*:RustEmitIr*
 :RustExpand    ft_rust.txt     /*:RustExpand*
@@ -2233,6 +2234,7 @@ $quote    eval.txt        /*$quote*
 :Termdebug     terminal.txt    /*:Termdebug*
 :TermdebugCommand      terminal.txt    /*:TermdebugCommand*
 :Texplore      pi_netrw.txt    /*:Texplore*
+:ToggleBreak   terminal.txt    /*:ToggleBreak*
 :Tutor pi_tutor.txt    /*:Tutor*
 :URLOpen       eval.txt        /*:URLOpen*
 :Until terminal.txt    /*:Until*
index eda0b8d4896795b40e5ac6406f799870b163556d..c25e265970bef6ca15946c2ef7436489c973d3cc 100644 (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
@@ -1427,12 +1427,16 @@ gdb:
  :Tbreak {position}
                set a temporary breakpoint at the specified 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
  *:Over*       execute the gdb "next" command (`:Next` is a Vim command)
  *:Until*      execute the gdb "until" command
  *:Finish*     execute the gdb "finish" 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
 
 If 'mouse' is set the plugin adds a window toolbar with these entries:
index 3be4b135fd5c3306ffd43f50aadcc47536eaa267..d4ee1ca77dc03f7a376779c8ce7861a0dca3a005 100644 (file)
@@ -4,7 +4,7 @@ vim9script
 
 # Author: Bram Moolenaar
 # 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>
 
 # WORK IN PROGRESS - The basics works stable, more to come
@@ -1173,6 +1173,7 @@ def InstallCommands()
 
   command -nargs=? Break  SetBreakpoint(<q-args>)
   command -nargs=? Tbreak  SetBreakpoint(<q-args>, true)
+  command ToggleBreak ToggleBreak()
   command Clear  ClearBreakpoint()
   command Step  SendResumingCommand('-exec-step')
   command Over  SendResumingCommand('-exec-next')
@@ -1182,6 +1183,7 @@ def InstallCommands()
   command -nargs=* Arguments  SendResumingCommand('-exec-arguments ' .. <q-args>)
   command Stop StopCommand()
   command Continue ContinueCommand()
+  command RunOrContinue RunOrContinue()
 
   command -nargs=* Frame  Frame(<q-args>)
   command -count=1 Up  Up(<count>)
@@ -1296,6 +1298,8 @@ def DeleteCommands()
   delcommand Asm
   delcommand Var
   delcommand Winbar
+  delcommand RunOrContinue
+  delcommand ToggleBreak
 
 
   if !empty(saved_K_map) && !saved_K_map.buffer
@@ -1439,6 +1443,19 @@ def ClearBreakpoint()
   endif
 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)
   if args != ''
     SendResumingCommand($'-exec-arguments {args}')
@@ -1446,6 +1463,14 @@ def Run(args: string)
   SendResumingCommand('-exec-run')
 enddef
 
+def RunOrContinue()
+    if running
+      ContinueCommand()
+    else
+      Run('')
+    endif
+enddef
+
 # :Frame - go to a specific frame in the stack
 def Frame(arg: string)
   # 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)
       breakpoint_locations[bploc] = []
     endif
-    breakpoint_locations[bploc] += [id]
+    if breakpoint_locations[bploc]->index(id) == -1
+      # Make sure all ids are unique
+      breakpoint_locations[bploc] += [id]
+    endif
 
     var posMsg = ''
     if bufloaded(fname)
index fa7dd13bdfbb3625682d9423e18c396cb514f899..9fec8f882fd6961aebf80b74c6757be44eef4496 100644 (file)
@@ -606,4 +606,87 @@ function Test_termdebug_config_types()
   unlet g:termdebug_config
 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
index 01f1f9799041db8b71ed2e236f841507efd4db52..7782b6a13d14f5de16949347f80838631b055df4 100644 (file)
@@ -724,6 +724,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1756,
 /**/
     1755,
 /**/