vim-patch:8.0.1092: terminal debugger can't evaluate expressions

Problem:    Terminal debugger can't evaluate expressions.
Solution:   Add :Evaluate and K.  Various other improvements.
45d5f26d11
This commit is contained in:
Jan Edmund Lazo
2019-04-16 01:50:25 -04:00
parent 9e9015ee23
commit e6f22d0fdd

View File

@@ -59,6 +59,7 @@ func s:StartDebug(cmd)
return return
endif endif
let pty = job_info(term_getjob(s:ptybuf))['tty_out'] let pty = job_info(term_getjob(s:ptybuf))['tty_out']
let s:ptywin = win_getid(winnr())
" Create a hidden terminal window to communicate with gdb " Create a hidden terminal window to communicate with gdb
let s:commbuf = term_start('NONE', { let s:commbuf = term_start('NONE', {
@@ -86,12 +87,15 @@ func s:StartDebug(cmd)
exe 'bwipe! ' . s:commbuf exe 'bwipe! ' . s:commbuf
return return
endif endif
let s:gdbwin = win_getid(winnr())
" Connect gdb to the communication pty, using the GDB/MI interface " Connect gdb to the communication pty, using the GDB/MI interface
call term_sendkeys(gdbbuf, 'new-ui mi ' . commpty . "\r") call term_sendkeys(gdbbuf, 'new-ui mi ' . commpty . "\r")
" Install debugger commands. " Install debugger commands in the text window.
call win_gotoid(s:startwin)
call s:InstallCommands() call s:InstallCommands()
call win_gotoid(s:gdbwin)
let s:breakpoints = {} let s:breakpoints = {}
endfunc endfunc
@@ -121,10 +125,14 @@ func s:CommOutput(chan, msg)
if msg != '' if msg != ''
if msg =~ '^\*\(stopped\|running\)' if msg =~ '^\*\(stopped\|running\)'
call s:HandleCursor(msg) call s:HandleCursor(msg)
elseif msg =~ '^\^done,bkpt=' elseif msg =~ '^\^done,bkpt=' || msg =~ '^=breakpoint-created,'
call s:HandleNewBreakpoint(msg) call s:HandleNewBreakpoint(msg)
elseif msg =~ '^=breakpoint-deleted,' elseif msg =~ '^=breakpoint-deleted,'
call s:HandleBreakpointDelete(msg) call s:HandleBreakpointDelete(msg)
elseif msg =~ '^\^done,value='
call s:HandleEvaluate(msg)
elseif msg =~ '^\^error,msg='
call s:HandleError(msg)
endif endif
endif endif
endfor endfor
@@ -135,9 +143,15 @@ func s:InstallCommands()
command Break call s:SetBreakpoint() command Break call s:SetBreakpoint()
command Delete call s:DeleteBreakpoint() command Delete call s:DeleteBreakpoint()
command Step call s:SendCommand('-exec-step') command Step call s:SendCommand('-exec-step')
command NNext call s:SendCommand('-exec-next') command Over call s:SendCommand('-exec-next')
command Finish call s:SendCommand('-exec-finish') command Finish call s:SendCommand('-exec-finish')
command Continue call s:SendCommand('-exec-continue') command Continue call s:SendCommand('-exec-continue')
command -range -nargs=* Evaluate call s:Evaluate(<range>, <q-args>)
command Gdb call win_gotoid(s:gdbwin)
command Program call win_gotoid(s:ptywin)
" TODO: can the K mapping be restored?
nnoremap K :Evaluate<CR>
endfunc endfunc
" Delete installed debugger commands in the current window. " Delete installed debugger commands in the current window.
@@ -145,9 +159,21 @@ func s:DeleteCommands()
delcommand Break delcommand Break
delcommand Delete delcommand Delete
delcommand Step delcommand Step
delcommand NNext delcommand Over
delcommand Finish delcommand Finish
delcommand Continue delcommand Continue
delcommand Evaluate
delcommand Gdb
delcommand Program
nunmap K
sign undefine debugPC
sign undefine debugBreakpoint
exe 'sign unplace ' . s:pc_id
for key in keys(s:breakpoints)
exe 'sign unplace ' . (s:break_id + key)
endfor
unlet s:breakpoints
endfunc endfunc
" :Break - Set a breakpoint at the cursor position. " :Break - Set a breakpoint at the cursor position.
@@ -176,6 +202,35 @@ func s:SendCommand(cmd)
call term_sendkeys(s:commbuf, a:cmd . "\r") call term_sendkeys(s:commbuf, a:cmd . "\r")
endfunc endfunc
" :Evaluate - evaluate what is under the cursor
func s:Evaluate(range, arg)
if a:arg != ''
let expr = a:arg
elseif a:range == 2
let pos = getcurpos()
let reg = getreg('v', 1, 1)
let regt = getregtype('v')
normal! gv"vy
let expr = @v
call setpos('.', pos)
call setreg('v', reg, regt)
else
let expr = expand('<cexpr>')
endif
call term_sendkeys(s:commbuf, '-data-evaluate-expression "' . expr . "\"\r")
let s:evalexpr = expr
endfunc
" Handle the result of data-evaluate-expression
func s:HandleEvaluate(msg)
echomsg '"' . s:evalexpr . '": ' . substitute(a:msg, '.*value="\(.*\)"', '\1', '')
endfunc
" Handle an error.
func s:HandleError(msg)
echoerr substitute(a:msg, '.*msg="\(.*\)"', '\1', '')
endfunc
" Handle stopping and running message from gdb. " Handle stopping and running message from gdb.
" Will update the sign that shows the current position. " Will update the sign that shows the current position.
func s:HandleCursor(msg) func s:HandleCursor(msg)