summaryrefslogtreecommitdiff
path: root/runtime
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-04-06 22:26:25 +0200
committerBram Moolenaar <Bram@vim.org>2018-04-06 22:26:25 +0200
commitc4b533e1e93151658cb170c6796d327a8c0f8612 (patch)
tree3c21fd7ee9a8cadb1ac10cbebcdb14ab3967239e /runtime
parent3680bab7e797444a7f41646888d9dd04b01c3816 (diff)
downloadvim-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.txt11
-rw-r--r--runtime/pack/dist/opt/termdebug/plugin/termdebug.vim66
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