Skip to content

Commit

Permalink
termdebug: frame related commands
Browse files Browse the repository at this point in the history
implementing `:Frame`, `:Up` and `:Down'

partially fixing vim#10393
  • Loading branch information
GitMensch committed Aug 21, 2023
1 parent 6909639 commit 8a23f86
Show file tree
Hide file tree
Showing 2 changed files with 106 additions and 0 deletions.
23 changes: 23 additions & 0 deletions runtime/doc/terminal.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1376,6 +1376,21 @@ This is similar to using "print" in the gdb window.
You can usually shorten `:Evaluate` to `:Ev`.


Navigation in the Stack ~
*termdebug-variables* *:Frame*
`:Frame` Select the given frame, using either the frame's
stack number, address, or function name.
`:Up` Select the frame that called the current one with an
optional argument to say how many frames to go up.
`+` same (see |termdebug_map_plus| to disable)
`:Down` Select the frame called by the current one with
an optional argument to say how many frames to go down.
`-` same (see |termdebug_map_minus| to disable)

This is similar to using "print" in the gdb window.
You can usually shorten `:Evaluate` to `:Ev`.


Other commands ~
*termdebug-commands*
*:Gdb* jump to the gdb window
Expand Down Expand Up @@ -1453,6 +1468,14 @@ The K key is normally mapped to :Evaluate. If you do not want this use: >
let g:termdebug_config['map_K'] = 0
If there is no g:termdebug_config you can use: >
let g:termdebug_map_K = 0
<
*termdebug_map_minus*
The - key is normally mapped to :Down. If you do not want this use: >
let g:termdebug_config['map_minus'] = 0
<
*termdebug_map_plus*
The + key is normally mapped to :Up. If you do not want this use: >
let g:termdebug_config['map_plus'] = 0
<
*termdebug_disasm_window*
If you want the Asm window shown by default, set the "disasm_window" flag to
Expand Down
83 changes: 83 additions & 0 deletions runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
Original file line number Diff line number Diff line change
Expand Up @@ -965,6 +965,10 @@ func s:InstallCommands()
command Continue call term_sendkeys(s:gdbbuf, "continue\r")
endif

command -nargs=* Frame call s:Frame(<q-args>)
command -nargs=* Up call s:Up(<q-args>)
command -nargs=* Down call s:Down(<q-args>)

command -range -nargs=* Evaluate call s:Evaluate(<range>, <q-args>)
command Gdb call win_gotoid(s:gdbwin)
command Program call s:GotoProgram()
Expand All @@ -984,6 +988,25 @@ func s:InstallCommands()
nnoremap K :Evaluate<CR>
endif

let map = 1
if exists('g:termdebug_config')
let map = get(g:termdebug_config, 'map_plus', 1)
endif
if map
let s:plus_map_saved = maparg('+', 'n', 0, 1)
nnoremap + :Up<CR>
endif

let map = 1
if exists('g:termdebug_config')
let map = get(g:termdebug_config, 'map_minus', 1)
endif
if map
let s:minus_map_saved = maparg('-', 'n', 0, 1)
nnoremap - :Down<CR>
endif


if has('menu') && &mouse != ''
call s:InstallWinbar(0)

Expand Down Expand Up @@ -1040,6 +1063,9 @@ func s:DeleteCommands()
delcommand Arguments
delcommand Stop
delcommand Continue
delcommand Frame
delcommand Up
delcommand Down
delcommand Evaluate
delcommand Gdb
delcommand Program
Expand All @@ -1056,6 +1082,22 @@ func s:DeleteCommands()
endif
unlet s:k_map_saved
endif
if exists('s:plus_map_saved')
if empty(s:plus_map_saved)
nunmap +
else
call mapset(s:plus_map_saved)
endif
unlet s:plus_map_saved
endif
if exists('s:minus_map_saved')
if empty(s:minus_map_saved)
nunmap -
else
call mapset(s:minus_map_saved)
endif
unlet s:minus_map_saved
endif

if has('menu')
" Remove the WinBar entries from all windows where it was added.
Expand Down Expand Up @@ -1172,6 +1214,47 @@ func s:Run(args)
call s:SendResumingCommand('-exec-run')
endfunc

" :Frame - go to a specfic frame in the stack
func s:Frame(arg)
" Note: we explicit do not use mi's command
" call s:SendCommand('-stack-select-frame "' . a:arg .'"')
" as we only get a "done" mi response and would have to open the file
" 'manually' - using cli command "frame" provides us with the mi response
" already parsed and allows for more formats
if a:arg =~ '^\d\+$' || a:arg == ''
" specify frame by number
call s:SendCommand('-interpreter-exec mi "frame ' . a:arg .'"')
elseif a:arg =~ '^0x[0-9a-fA-F]\+$'
" specify frame by stack address
call s:SendCommand('-interpreter-exec mi "frame address ' . a:arg .'"')
else
" specify frame by function name
call s:SendCommand('-interpreter-exec mi "frame function ' . a:arg .'"')
endif
endfunc

" :Up - go one frame in the stack "higher"
func s:Up(arg)
if a:arg != ''
let s:cmd = '"up ' . a:arg . '"'
else
let s:cmd = '"up"'
endif
" the 'correct' one would be -stack-select-frame N, but we don't know N
call s:SendCommand('-interpreter-exec console ' . s:cmd)
endfunc

" :Down - go one frame in the stack "below"
func s:Down(arg)
if a:arg != ''
let s:cmd = '"down ' . a:arg . '"'
else
let s:cmd = '"down"'
endif
" the 'correct' one would be -stack-select-frame N, but we don't know N
call s:SendCommand('-interpreter-exec console ' . s:cmd)
endfunc

func s:SendEval(expr)
" check for "likely" boolean expressions, in which case we take it as lhs
if a:expr =~ "[=!<>]="
Expand Down

0 comments on commit 8a23f86

Please sign in to comment.