]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
runtime(termdebug): add frame related commands (#12511)
authorSimon Sobisch <simonsobisch@web.de>
Tue, 22 Aug 2023 20:19:14 +0000 (22:19 +0200)
committerGitHub <noreply@github.com>
Tue, 22 Aug 2023 20:19:14 +0000 (22:19 +0200)
implementing `:Frame`, `:Up` and `:Down'

partially fixing #10393

Signed-off-by: Christian Brabandt <cb@256bit.org>
runtime/doc/terminal.txt
runtime/pack/dist/opt/termdebug/plugin/termdebug.vim

index 5e4ad1fcfe829429ec122018867c2d7b6985fc22..632431c5f56e0813581e8b8b7272567e94ded6a6 100644 (file)
@@ -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
@@ -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
index 384cef27a34be9b667bc1a8daf50c605583e5710..f9cfe8cdf7262afc3ec40168b4f8444a69e15971 100644 (file)
@@ -972,6 +972,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()
@@ -991,6 +995,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)
 
@@ -1047,6 +1070,9 @@ func s:DeleteCommands()
   delcommand Arguments
   delcommand Stop
   delcommand Continue
+  delcommand Frame
+  delcommand Up
+  delcommand Down
   delcommand Evaluate
   delcommand Gdb
   delcommand Program
@@ -1063,6 +1089,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.
@@ -1179,6 +1221,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 =~ "[=!<>]="