*TermdebugStartPre*
TermdebugStartPre Before starting debugging.
Not triggered if the debugger is already
- running or |g:termdebugger| cannot be
+ running or the debugger command cannot be
executed.
*TermdebugStartPost*
TermdebugStartPost After debugging has initialized.
*termdebug_use_prompt*
Prompt mode can be used even when the |+terminal| feature is present with: >
+ let g:termdebug_config['use_prompt'] = 1
+Or if there is no g:termdebug_config: >
let g:termdebug_use_prompt = 1
<
*termdebug_map_K*
The K key is normally mapped to :Evaluate. If you do not want this use: >
+ let g:termdebug_config['map_K'] = 0
+Or if there is no g:termdebug_config: >
let g:termdebug_map_K = 0
-
<
*termdebug_disasm_window*
-If you want the Asm window shown by default, set this to 1. Setting to
-any value greater than 1 will set the Asm window height to that value: >
+If you want the Asm window shown by default, set the flag to 1.
+the "disasm_window_height" entry can be used to set the window height: >
+ let g:termdebug_config['disasm_window'] = 1
+ let g:termdebug_config['disasm_window_height'] = 15
+or, if there is no g:termdebug_config: >
let g:termdebug_disasm_window = 15
-<
+Any value greater than 1 will set the Asm window height to that value: >
Communication ~
*termdebug-communication*
Customizing ~
+ *termdebug-customizing* *g:termdebug_config*
+In the past several global variables were used for configuration. These are
+deprecated, using the g:termdebug_config dictionary is preferred. When
+g:termdebug_config exists the other global variables will not be used.
-GDB command *termdebug-customizing*
+
+GDB command ~
*g:termdebugger*
-To change the name of the gdb command, set the "g:termdebugger" variable before
-invoking `:Termdebug`: >
+To change the name of the gdb command, set "debugger" entry in
+g:termdebug_config or the "g:termdebugger" variable before invoking
+`:Termdebug`: >
+ let g:termdebug_config['command'] = "mygdb"
+Or if there is no g:termdebug_config: >
let g:termdebugger = "mygdb"
+
If the command needs an argument use a List: >
+ let g:termdebug_config['command'] = ['rr', 'replay', '--']
+Or if there is no g:termdebug_config: >
let g:termdebugger = ['rr', 'replay', '--']
-< *gdb-version*
+
+Several arguments will be added to make gdb work well for the debugger.
+If you want to modify them, add a function to filter the argument list: >
+ let g:termdebug_config['command_filter'] = MyDebugFilter
+
+If you do not want the arguments to be added, but you do need to set the
+"pty", use a function to add the necessary arguments: >
+ let g:termdebug_config['command_add_args'] = MyAddArguments
+The function will be called with the list of arguments so far, and a second
+argument that is the name of the pty.
+ *gdb-version*
Only debuggers fully compatible with gdb will work. Vim uses the GDB/MI
interface. The "new-ui" command requires gdb version 7.12 or later. if you
get this error:
Then your gdb is too old.
-Colors *hl-debugPC* *hl-debugBreakpoint*
-
+Colors~
+ *hl-debugPC* *hl-debugBreakpoint*
The color of the signs can be adjusted with these highlight groups:
- debugPC the current position
- debugBreakpoint a breakpoint
Clear breakpoint `:Clear`
Evaluate `:Evaluate`
If you don't want this then disable it with: >
+ let g:termdebug_config['popup'] = 0
+or if there is no g:termdebug_config: >
let g:termdebug_popup = 0
To change the width of the Vim window when debugging starts and use a vertical
split: >
+ let g:termdebug_config['wide'] = 163
+Or if there is no g:termdebug_config: >
let g:termdebug_wide = 163
This will set 'columns' to 163 when `:Termdebug` is used. The value is
restored when quitting the debugger.
-If g:termdebug_wide is set and 'columns' is already a greater value, then a
+If the wide value is set and 'columns' is already a greater value, then a
vertical split will be used without modifying 'columns'.
-Set g:termdebug_wide to 1 to use a vertical split without ever changing
+Set the wide value to 1 to use a vertical split without ever changing
'columns'. This is useful when the terminal can't be resized by Vim.
"
" Author: Bram Moolenaar
" Copyright: Vim license applies, see ":help license"
-" Last Change: 2022 May 09
+" Last Change: 2022 May 23
"
" WORK IN PROGRESS - The basics works stable, more to come
" Note: In general you need at least GDB 7.12 because this provides the
command -nargs=* -complete=file -bang Termdebug call s:StartDebug(<bang>0, <f-args>)
command -nargs=+ -complete=file -bang TermdebugCommand call s:StartDebugCommand(<bang>0, <f-args>)
-" Name of the gdb command, defaults to "gdb".
-if !exists('g:termdebugger')
- let g:termdebugger = 'gdb'
-endif
-
let s:pc_id = 12
let s:asm_id = 13
let s:break_id = 14 " breakpoint number is added to this
hi default debugBreakpoint term=reverse ctermbg=red guibg=red
hi default debugBreakpointDisabled term=reverse ctermbg=gray guibg=gray
+" Get the command to execute the debugger as a list, defaults to ["gdb"].
func s:GetCommand()
- return type(g:termdebugger) == v:t_list ? copy(g:termdebugger) : [g:termdebugger]
+ if exists('g:termdebug_config')
+ let cmd = get(g:termdebug_config, 'command', 'gdb')
+ elseif exists('g:termdebugger')
+ let cmd = g:termdebugger
+ else
+ let cmd = 'gdb'
+ endif
+
+ return type(cmd) == v:t_list ? copy(cmd) : [cmd]
endfunc
func s:StartDebug(bang, ...)
let s:save_columns = 0
let s:allleft = 0
- if exists('g:termdebug_wide')
- if &columns < g:termdebug_wide
+ let wide = 0
+ if exists('g:termdebug_config')
+ let wide = get(g:termdebug_config, 'wide', 0)
+ elseif exists('g:termdebug_wide')
+ let wide = g:termdebug_wide
+ endif
+ if wide > 0
+ if &columns < wide
let s:save_columns = &columns
- let &columns = g:termdebug_wide
+ let &columns = wide
" If we make the Vim window wider, use the whole left half for the debug
" windows.
let s:allleft = 1
endif
" Override using a terminal window by setting g:termdebug_use_prompt to 1.
- let use_prompt = exists('g:termdebug_use_prompt') && g:termdebug_use_prompt
+ let use_prompt = 0
+ if exists('g:termdebug_config')
+ let use_prompt = get(g:termdebug_config, 'use_prompt', 0)
+ elseif exists('g:termdebug_use_prompt')
+ let use_prompt = g:termdebug_use_prompt
+ endif
if has('terminal') && !has('win32') && !use_prompt
let s:way = 'terminal'
else
call s:StartDebug_term(a:dict)
endif
- if exists('g:termdebug_disasm_window')
- if g:termdebug_disasm_window
- let curwinid = win_getid(winnr())
- call s:GotoAsmwinOrCreateIt()
- call win_gotoid(curwinid)
- endif
+ if s:GetDisasmWindow()
+ let curwinid = win_getid(winnr())
+ call s:GotoAsmwinOrCreateIt()
+ call win_gotoid(curwinid)
endif
if exists('#User#TermdebugStartPost')
let proc_args = get(a:dict, 'proc_args', [])
let gdb_cmd = s:GetCommand()
- " Add -quiet to avoid the intro message causing a hit-enter prompt.
- let gdb_cmd += ['-quiet']
- " Disable pagination, it causes everything to stop at the gdb
- let gdb_cmd += ['-iex', 'set pagination off']
- " Interpret commands while the target is running. This should usually only
- " be exec-interrupt, since many commands don't work properly while the
- " target is running (so execute during startup).
- let gdb_cmd += ['-iex', 'set mi-async on']
- " Open a terminal window to run the debugger.
- let gdb_cmd += ['-tty', pty]
- " Command executed _after_ startup is done, provides us with the necessary feedback
- let gdb_cmd += ['-ex', 'echo startupdone\n']
+
+ if exists('g:termdebug_config') && has_key(g:termdebug_config, 'command_add_args')
+ let gdb_cmd = g:termdebug_config.command_add_args(gdb_cmd, pty)
+ else
+ " Add -quiet to avoid the intro message causing a hit-enter prompt.
+ let gdb_cmd += ['-quiet']
+ " Disable pagination, it causes everything to stop at the gdb
+ let gdb_cmd += ['-iex', 'set pagination off']
+ " Interpret commands while the target is running. This should usually only
+ " be exec-interrupt, since many commands don't work properly while the
+ " target is running (so execute during startup).
+ let gdb_cmd += ['-iex', 'set mi-async on']
+ " Open a terminal window to run the debugger.
+ let gdb_cmd += ['-tty', pty]
+ " Command executed _after_ startup is done, provides us with the necessary
+ " feedback
+ let gdb_cmd += ['-ex', 'echo startupdone\n']
+ endif
+
+ if exists('g:termdebug_config') && has_key(g:termdebug_config, 'command_filter')
+ let gdb_cmd = g:termdebug_config.command_filter(gdb_cmd)
+ endif
" Adding arguments requested by the user
let gdb_cmd += gdb_args
command Asm call s:GotoAsmwinOrCreateIt()
command Winbar call s:InstallWinbar()
- if !exists('g:termdebug_map_K') || g:termdebug_map_K
+ let map = 1
+ if exists('g:termdebug_config')
+ let map = get(g:termdebug_config, 'map_K', 1)
+ elseif exists('g:termdebug_map_K')
+ let map = g:termdebug_map_K
+ endif
+ if map
let s:k_map_saved = maparg('K', 'n', 0, 1)
nnoremap K :Evaluate<CR>
endif
if has('menu') && &mouse != ''
call s:InstallWinbar()
- if !exists('g:termdebug_popup') || g:termdebug_popup != 0
+ let popup = 1
+ if exists('g:termdebug_config')
+ let popup = get(g:termdebug_config, 'popup', 1)
+ elseif exists('g:termdebug_popup')
+ let popup = g:termdebug_popup
+ endif
+ if popup
let s:saved_mousemodel = &mousemodel
let &mousemodel = 'popup_setpos'
an 1.200 PopUp.-SEP3- <Nop>
endif
endfunc
+func s:GetDisasmWindow()
+ if exists('g:termdebug_config')
+ return get(g:termdebug_config, 'disasm_window', 0)
+ endif
+ if exists('g:termdebug_disasm_window')
+ return g:termdebug_disasm_window
+ endif
+ return 0
+endfunc
+
+func s:GetDisasmWindowHeight()
+ if exists('g:termdebug_config')
+ return get(g:termdebug_config, 'disasm_window_height', 0)
+ endif
+ if exists('g:termdebug_disasm_window') && g:termdebug_disasm_window > 1
+ return g:termdebug_disasm_window
+ endif
+ return 0
+endfunc
+
func s:GotoAsmwinOrCreateIt()
if !win_gotoid(s:asmwin)
if win_gotoid(s:sourcewin)
exe 'file Termdebug-asm-listing'
endif
- if exists('g:termdebug_disasm_window')
- if g:termdebug_disasm_window > 1
- exe 'resize ' . g:termdebug_disasm_window
- endif
+ if s:GetDisasmWindowHeight() > 0
+ exe 'resize ' .. s:GetDisasmWindowHeight()
endif
endif