diff options
author | Bram Moolenaar <Bram@vim.org> | 2018-04-06 22:26:25 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2018-04-06 22:26:25 +0200 |
commit | c4b533e1e93151658cb170c6796d327a8c0f8612 (patch) | |
tree | 3c21fd7ee9a8cadb1ac10cbebcdb14ab3967239e /runtime | |
parent | 3680bab7e797444a7f41646888d9dd04b01c3816 (diff) | |
download | vim-git-c4b533e1e93151658cb170c6796d327a8c0f8612.tar.gz |
patch 8.0.1668: terminal debugger: can't re-open source code windowv8.0.1668
Problem: Terminal debugger: can't re-open source code window.
Solution: Add the :Source command. Also create the window if needed when
gdb stops at a source line.
Diffstat (limited to 'runtime')
-rw-r--r-- | runtime/doc/terminal.txt | 11 | ||||
-rw-r--r-- | runtime/pack/dist/opt/termdebug/plugin/termdebug.vim | 66 |
2 files changed, 48 insertions, 29 deletions
diff --git a/runtime/doc/terminal.txt b/runtime/doc/terminal.txt index 9a1c1d229..2d1af1126 100644 --- a/runtime/doc/terminal.txt +++ b/runtime/doc/terminal.txt @@ -731,6 +731,11 @@ to have the 'mouse' option set to enable mouse clicks. You can add the window toolbar in other windows you open with: > :Winbar +If gdb stops at a source line and there is no window currently showing the +source code, a new window will be created for the source code. This also +happens if the buffer in the source code window has been modified and can't be +abandoned. + Inspecting variables ~ *termdebug-variables* @@ -745,8 +750,10 @@ You can usually shorten `:Evaluate` to `:Ev`. Other commands ~ *termdebug-commands* - :Gdb jump to the gdb window - :Program jump to the window with the running program + :Gdb jump to the gdb window + :Program jump to the window with the running program + :Source jump to the window with the source code, create it if there + isn't one Communication ~ diff --git a/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim b/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim index 086a8f1ec..256f7ef60 100644 --- a/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim +++ b/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim @@ -246,6 +246,7 @@ func s:InstallCommands() command -range -nargs=* Evaluate call s:Evaluate(<range>, <q-args>) command Gdb call win_gotoid(s:gdbwin) command Program call win_gotoid(s:ptywin) + command Source call s:GotoStartwinOrCreateIt() command Winbar call s:InstallWinbar() " TODO: can the K mapping be restored? @@ -269,13 +270,15 @@ let s:winbar_winids = [] " Install the window toolbar in the current window. func s:InstallWinbar() - nnoremenu WinBar.Step :Step<CR> - nnoremenu WinBar.Next :Over<CR> - nnoremenu WinBar.Finish :Finish<CR> - nnoremenu WinBar.Cont :Continue<CR> - nnoremenu WinBar.Stop :Stop<CR> - nnoremenu WinBar.Eval :Evaluate<CR> - call add(s:winbar_winids, win_getid(winnr())) + if has('menu') && &mouse != '' + nnoremenu WinBar.Step :Step<CR> + nnoremenu WinBar.Next :Over<CR> + nnoremenu WinBar.Finish :Finish<CR> + nnoremenu WinBar.Cont :Continue<CR> + nnoremenu WinBar.Stop :Stop<CR> + nnoremenu WinBar.Eval :Evaluate<CR> + call add(s:winbar_winids, win_getid(winnr())) + endif endfunc " Delete installed debugger commands in the current window. @@ -450,6 +453,14 @@ func s:HandleError(msg) echoerr substitute(a:msg, '.*msg="\(.*\)"', '\1', '') endfunc +func s:GotoStartwinOrCreateIt() + if !win_gotoid(s:startwin) + new + let s:startwin = win_getid(winnr()) + call s:InstallWinbar() + endif +endfunc + " Handle stopping and running message from gdb. " Will update the sign that shows the current position. func s:HandleCursor(msg) @@ -461,31 +472,32 @@ func s:HandleCursor(msg) let s:stopped = 0 endif - if win_gotoid(s:startwin) - let fname = substitute(a:msg, '.*fullname="\([^"]*\)".*', '\1', '') - if a:msg =~ '^\(\*stopped\|=thread-selected\)' && filereadable(fname) - let lnum = substitute(a:msg, '.*line="\([^"]*\)".*', '\1', '') - if lnum =~ '^[0-9]*$' - if expand('%:p') != fnamemodify(fname, ':p') - if &modified - " TODO: find existing window - exe 'split ' . fnameescape(fname) - let s:startwin = win_getid(winnr()) - else - exe 'edit ' . fnameescape(fname) - endif + call s:GotoStartwinOrCreateIt() + + let fname = substitute(a:msg, '.*fullname="\([^"]*\)".*', '\1', '') + if a:msg =~ '^\(\*stopped\|=thread-selected\)' && filereadable(fname) + let lnum = substitute(a:msg, '.*line="\([^"]*\)".*', '\1', '') + if lnum =~ '^[0-9]*$' + if expand('%:p') != fnamemodify(fname, ':p') + if &modified + " TODO: find existing window + exe 'split ' . fnameescape(fname) + let s:startwin = win_getid(winnr()) + call s:InstallWinbar() + else + exe 'edit ' . fnameescape(fname) endif - exe lnum - exe 'sign unplace ' . s:pc_id - exe 'sign place ' . s:pc_id . ' line=' . lnum . ' name=debugPC file=' . fname - setlocal signcolumn=yes endif - else + exe lnum exe 'sign unplace ' . s:pc_id + exe 'sign place ' . s:pc_id . ' line=' . lnum . ' name=debugPC file=' . fname + setlocal signcolumn=yes endif - - call win_gotoid(wid) + else + exe 'sign unplace ' . s:pc_id endif + + call win_gotoid(wid) endfunc " Handle setting a breakpoint |