diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-12-15 06:27:49 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-15 06:27:49 +0800 |
commit | 046efa106e93303bc848edf63887b3bc0889b535 (patch) | |
tree | 7a6f439a724ad180f9176562a0c4d18db3df7d89 | |
parent | ef38fdfdc6c84abd8ce7be02eaf8edc91ebc7917 (diff) | |
download | rneovim-046efa106e93303bc848edf63887b3bc0889b535.tar.gz rneovim-046efa106e93303bc848edf63887b3bc0889b535.tar.bz2 rneovim-046efa106e93303bc848edf63887b3bc0889b535.zip |
vim-patch:323dda1484d9 (#26583)
runtime(termdebug): add Tbreak command
closes: vim/vim#13656
https://github.com/vim/vim/commit/323dda1484d95ee5c8a1b2205f8c495446df75ee
Co-authored-by: iam28th <artyom28th@gmail.com>
-rw-r--r-- | runtime/doc/nvim_terminal_emulator.txt | 9 | ||||
-rw-r--r-- | runtime/pack/dist/opt/termdebug/plugin/termdebug.vim | 11 | ||||
-rw-r--r-- | test/old/testdir/test_termdebug.vim | 89 |
3 files changed, 99 insertions, 10 deletions
diff --git a/runtime/doc/nvim_terminal_emulator.txt b/runtime/doc/nvim_terminal_emulator.txt index dbc14f5a44..67e5e53c95 100644 --- a/runtime/doc/nvim_terminal_emulator.txt +++ b/runtime/doc/nvim_terminal_emulator.txt @@ -283,8 +283,13 @@ gdb: `:Run` [args] run the program with [args] or the previous arguments `:Arguments` {args} set arguments for the next `:Run` - *:Break* set a breakpoint at the current line; a sign will be displayed - *:Clear* delete the breakpoint at the current line + *:Break* set a breakpoint at the cursor position + :Break {position} + set a breakpoint at the specified position + *:Tbreak* set a temporary breakpoint at the cursor position + :Tbreak {position} + set a temporary breakpoint at the specified position + *:Clear* delete the breakpoint at the cursor position *:Step* execute the gdb "step" command *:Over* execute the gdb "next" command (`:Next` is a Vim command) diff --git a/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim b/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim index 1b5baa9a8b..ee2dc4478e 100644 --- a/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim +++ b/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim @@ -985,6 +985,7 @@ func s:InstallCommands() set cpo&vim command -nargs=? Break call s:SetBreakpoint(<q-args>) + command -nargs=? Tbreak call s:SetBreakpoint(<q-args>, v:true) command Clear call s:ClearBreakpoint() command Step call s:SendResumingCommand('-exec-step') command Over call s:SendResumingCommand('-exec-next') @@ -1093,6 +1094,7 @@ endfunc " Delete installed debugger commands in the current window. func s:DeleteCommands() delcommand Break + delcommand Tbreak delcommand Clear delcommand Step delcommand Over @@ -1193,7 +1195,7 @@ func s:Until(at) endfunc " :Break - Set a breakpoint at the cursor position. -func s:SetBreakpoint(at) +func s:SetBreakpoint(at, tbreak=v:false) " Setting a breakpoint may not work while the program is running. " Interrupt to make it work. let do_continue = 0 @@ -1206,7 +1208,12 @@ func s:SetBreakpoint(at) " Use the fname:lnum format, older gdb can't handle --source. let at = empty(a:at) ? \ fnameescape(expand('%:p')) . ':' . line('.') : a:at - call s:SendCommand('-break-insert ' . at) + if a:tbreak + let cmd = '-break-insert -t ' . at + else + let cmd = '-break-insert ' . at + endif + call s:SendCommand(cmd) if do_continue Continue endif diff --git a/test/old/testdir/test_termdebug.vim b/test/old/testdir/test_termdebug.vim index 98a4bd3215..33cdaf1611 100644 --- a/test/old/testdir/test_termdebug.vim +++ b/test/old/testdir/test_termdebug.vim @@ -18,9 +18,8 @@ if g:GCC->empty() throw 'Skipped: gcc is not found in $PATH' endif -packadd termdebug - -func Test_termdebug_basic() +function s:generate_files(bin_name) + let src_name = a:bin_name .. '.c' let lines =<< trim END #include <stdio.h> #include <stdlib.h> @@ -46,8 +45,21 @@ func Test_termdebug_basic() return 0; } END - call writefile(lines, 'XTD_basic.c', 'D') - call system($'{g:GCC} -g -o XTD_basic XTD_basic.c') + call writefile(lines, src_name) + call system($'{g:GCC} -g -o {a:bin_name} {src_name}') +endfunction + +function s:cleanup_files(bin_name) + call delete(a:bin_name) + call delete(a:bin_name .. '.c') +endfunction + +packadd termdebug + +func Test_termdebug_basic() + let bin_name = 'XTD_basic' + let src_name = bin_name .. '.c' + call s:generate_files(bin_name) edit XTD_basic.c Termdebug ./XTD_basic @@ -149,7 +161,72 @@ func Test_termdebug_basic() call WaitForAssert({-> assert_equal(1, winnr('$'))}) call assert_equal([], sign_getplaced('', #{group: 'TermDebug'})[0].signs) - call delete('XTD_basic') + call s:cleanup_files(bin_name) + %bw! +endfunc + +func Test_termdebug_tbreak() + 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_equal(3, winnr('$'))}) + let gdb_buf = winbufnr(1) + wincmd b + + let bp_line = 22 " 'return' statement in main + let temp_bp_line = 10 " 'if' statement in 'for' loop body + execute "Tbreak " .. temp_bp_line + execute "Break " .. bp_line + + call Nterm_wait(gdb_buf) + redraw! + " both temporary and normal breakpoint signs were displayed... + call assert_equal([ + \ {'lnum': temp_bp_line, 'id': 1014, 'name': 'debugBreakpoint1.0', + \ 'priority': 110, 'group': 'TermDebug'}, + \ {'lnum': bp_line, 'id': 2014, 'name': 'debugBreakpoint2.0', + \ 'priority': 110, 'group': 'TermDebug'}], + \ sign_getplaced('', #{group: 'TermDebug'})[0].signs) + + Run + call Nterm_wait(gdb_buf, 400) + redraw! + " debugPC sign is on the line where the temp. bp was set; + " temp. bp sign was removed after hit; + " normal bp sign is still present + call WaitForAssert({-> assert_equal([ + \ {'lnum': temp_bp_line, 'id': 12, 'name': 'debugPC', 'priority': 110, + \ 'group': 'TermDebug'}, + \ {'lnum': bp_line, 'id': 2014, 'name': 'debugBreakpoint2.0', + \ 'priority': 110, 'group': 'TermDebug'}], + \ sign_getplaced('', #{group: 'TermDebug'})[0].signs)}) + + Continue + call Nterm_wait(gdb_buf) + redraw! + " debugPC is on the normal breakpoint, + " temp. bp on line 10 was only hit once + call WaitForAssert({-> assert_equal([ + \ {'lnum': bp_line, 'id': 12, 'name': 'debugPC', 'priority': 110, + \ 'group': 'TermDebug'}, + \ {'lnum': bp_line, 'id': 2014, 'name': 'debugBreakpoint2.0', + \ 'priority': 110, 'group': 'TermDebug'}], + "\ sign_getplaced('', #{group: 'TermDebug'})[0].signs)}) + \ sign_getplaced('', #{group: 'TermDebug'})[0].signs->reverse())}) + + 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 |