Mercurial > vim
changeset 13592:a64485061f75 v8.0.1668
patch 8.0.1668: terminal debugger: can't re-open source code window
commit https://github.com/vim/vim/commit/c4b533e1e93151658cb170c6796d327a8c0f8612
Author: Bram Moolenaar <Bram@vim.org>
Date: Fri Apr 6 22:26:25 2018 +0200
patch 8.0.1668: terminal debugger: can't re-open source code window
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.
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Fri, 06 Apr 2018 22:30:07 +0200 |
parents | 035fc9d3dd9b |
children | 1e1e371e8a4c |
files | runtime/doc/terminal.txt runtime/pack/dist/opt/termdebug/plugin/termdebug.vim src/version.c |
diffstat | 3 files changed, 50 insertions(+), 29 deletions(-) [+] |
line wrap: on
line diff
--- a/runtime/doc/terminal.txt +++ b/runtime/doc/terminal.txt @@ -731,6 +731,11 @@ to have the 'mouse' option set to enable 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 ` 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 ~
--- 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 + else + exe 'sign unplace ' . s:pc_id + endif - call win_gotoid(wid) - endif + call win_gotoid(wid) endfunc " Handle setting a breakpoint