Nvim :help
页面,生成 自 源文件,使用 tree-sitter-vimdoc 解析器。
:edit term://bash
:vsplit term://top
autocmd VimEnter * ++nested split term://sh
<C-\>
之外的所有键都将发送到基础程序。如果按下 <C-\>
,则会发送下一个键,除非它是 <C-N>
或 <C-O>
。使用 <C-\>
<C-N>
返回普通模式。 CTRL-\_CTRL-N 使用 <C-\>
<C-O>
执行一个普通模式命令,然后返回终端模式。 t_CTRL-\_CTRL-O<Esc>
映射为退出终端模式:tnoremap <Esc> <C-\><C-n>
要在终端模式下模拟 i_CTRL-R:tnoremap <expr> <C-R> '<C-\><C-N>"'.nr2char(getchar()).'pi'
要使用 ALT+{h,j,k,l}
从任何模式导航窗口:tnoremap <A-h> <C-\><C-N><C-w>h
:tnoremap <A-j> <C-\><C-N><C-w>j
:tnoremap <A-k> <C-\><C-N><C-w>k
:tnoremap <A-l> <C-\><C-N><C-w>l
:inoremap <A-h> <C-\><C-N><C-w>h
:inoremap <A-j> <C-\><C-N><C-w>j
:inoremap <A-k> <C-\><C-N><C-w>k
:inoremap <A-l> <C-\><C-N><C-w>l
:nnoremap <A-h> <C-w>h
:nnoremap <A-j> <C-w>j
:nnoremap <A-k> <C-w>k
:nnoremap <A-l> <C-w>l
您还可以创建类似于终端模式映射的菜单,但您必须使用 :tlmenu 而不是 :tmenu。au TermOpen * setlocal list
{g,b}:terminal_color_x
变量控制终端颜色调色板,其中 x
是 0 到 15(含)之间的颜色索引。在 TermOpen 期间读取这些变量。该值必须是颜色名称或十六进制字符串。示例let g:terminal_color_4 = '#ff0000'
let g:terminal_color_5 = 'green'
仅适用于 RGB UI(请参阅 'termguicolors');对于 256 色终端,颜色索引只是转发。vim.api.nvim_create_autocmd({ 'TermRequest' }, {
desc = 'Handles OSC 7 dir change requests',
callback = function(ev)
if string.sub(vim.v.termrequest, 1, 4) == '\x1b]7;' then
local dir = string.gsub(vim.v.termrequest, '\x1b]7;file://[^/]*', '')
if vim.fn.isdirectory(dir) == 0 then
vim.notify('invalid dir: '..dir)
return
end
vim.api.nvim_buf_set_var(ev.buf, 'osc7_dir', dir)
if vim.o.autochdir and vim.api.nvim_get_current_buf() == ev.buf then
vim.cmd.cd(dir)
end
end
end
})
vim.api.nvim_create_autocmd({ 'BufEnter', 'WinEnter', 'DirChanged' }, {
callback = function(ev)
if vim.b.osc7_dir and vim.fn.isdirectory(vim.b.osc7_dir) == 1 then
vim.cmd.cd(vim.b.osc7_dir)
end
end
})
要试用它,请选择上面的代码,并使用 :'<,'>lua
对其进行源代码化,然后在 :terminal 缓冲区中运行以下命令printf "\033]7;file://./foo/bar\033\\"OSC 52:写入系统剪贴板 terminal-osc52
printf '\033]52;;%s\033\\' "$(echo -n 'Hello world' | base64)"Nvim 使用配置的 剪贴板 提供程序写入系统剪贴板。不支持使用 OSC 52 从系统剪贴板读取,因为这将允许 :terminal 中的任何任意程序读取用户的剪贴板。
:autocmd TermOpen * setlocal statusline=%{b:term_title}
:TermdebugCommand
命令,后跟命令名称和附加参数。:TermdebugCommand vim --clean -c ':set nu'
:Termdebug
和 :TermdebugCommand
都支持可选的 "!" 感叹号参数,以立即启动命令,而无需在 gdb 窗口中暂停(光标将在被调试的窗口中)。例如:TermdebugCommand! vim --clean
要将 gdb 附加到正在运行的可执行文件或使用核心文件,请传递额外的参数。例如:Termdebug vim core
:Termdebug vim 98343
如果没有给出参数,您将最终进入 gdb 窗口,您需要在其中使用 gdb file
命令指定要运行的命令。% make启动 Vim
% ./vim加载 termdebug 插件并开始调试 Vim
:packadd termdebug
:Termdebug vim
您现在应该有三个窗口:源 - 您在其中启动 gdb - 您可以在此处键入 gdb 命令程序 - 执行的程序将使用此窗口break ex_help runVim 将在程序窗口中开始运行。将焦点放在那里,然后键入
:help gui
Gdb 将进入 ex_help 断点。源窗口现在显示 ex_cmds.c 文件。符号列中将出现一个红色的 "1 " 标记,表示设置断点的位置。调试器停止的代码行将被高亮显示。您现在可以逐步执行程序。您会看到高亮显示随着调试器执行一行源代码而移动。print *eap如果鼠标指针移动有效,Vim 还将在鼠标停留在可以通过 gdb 评估的文本上时显示气泡。您还可以使用 "K" 映射,它将使用 Nvim 浮动窗口来显示结果。
:Break您将看到出现一个 "1" 标记,这表示新的断点。现在运行 ":Cont" 命令,代码将执行到断点为止。
watch curbuf现在运行 ":Cont"(或在 gdb 窗口中键入 "cont")。执行将继续进行,直到 "curbuf" 的值发生更改,该值在 do_ecmd() 中。要再次删除此监视点,请在 gdb 窗口中键入
delete 3您可以通过在 gdb 窗口中键入以下命令来查看堆栈
where在堆栈帧之间移动,例如使用
frame 3源窗口将显示代码,在调用更深层级时进行调用。
CTRL-C
中断程序:Run
[args] 使用 [args] 或之前的参数运行程序 :Arguments
{args}
设置下一个 :Run
的参数{position}
在指定位置设置断点 :Tbreak 在光标位置设置临时断点 :Tbreak {position}
在指定位置设置临时断点 :Clear 删除光标位置的断点:Next
是 Vim 命令) :Until 执行 gdb 的 "until" 命令 :Finish 执行 gdb 的 "finish" 命令 :Continue 执行 gdb 的 "continue" 命令 :Stop 中断程序:Clear
命令(如果光标在带有断点的行中),或者使用“Clear breakpoint”右键菜单条目。:Evaluate
评估光标下的表达式 K
同上 (参见 termdebug_map_K 以禁用) :Evaluate
{expr}
评估 {expr}
:'<,'>Evaluate
评估 Visual 选择的文本:Evaluate
简写为 :Ev
。结果将显示在浮动窗口中。您可以通过再次运行 :Evaluate
(或 K
) 将光标移动到此窗口。:Frame
[frame] 选择帧 [frame],它是一个帧编号、地址或函数名 (默认:当前帧) :Up
[count] 上移 [count] 个帧 (默认:1;调用当前帧的帧) +
同上 (参见 termdebug_map_plus 以禁用) :Down
[count] 下移 [count] 个帧 (默认:1;被当前帧调用的帧) -
同上 (参见 termdebug_map_minus 以禁用)au User TermdebugStartPre echomsg 'debugging starting'
au User TermdebugStartPost echomsg 'debugging started'
au User TermdebugStopPre echomsg 'debugging stopping'
au User TermdebugStopPost echomsg 'debugging stopped'
:Termdebug
或 :TermdebugCommand
,则在 gdb 中运行提供的命令之前触发该事件。 TermdebugStopPrelet g:termdebug_config = {}
然后您可以根据以下说明添加字典条目。为了完整性,已列出已弃用的全局变量名称。如果您要切换到使用 g:termdebug_config,您可以找到旧的变量名并接管其值,然后删除已弃用的变量。<Esc>
进入普通模式,然后您就可以在缓冲区中移动、复制/粘贴等。使用任何以插入模式开始的命令(例如 a
或 i
)返回到编辑 gdb 命令。let g:termdebug_config['use_prompt'] = 1
如果没有 g:termdebug_config,您可以使用let g:termdebug_use_prompt = 1
let g:termdebug_config['map_K'] = 0
如果没有 g:termdebug_config,您可以使用let g:termdebug_map_K = 0
let g:termdebug_config['map_minus'] = 0
let g:termdebug_config['map_plus'] = 0
let g:termdebug_config['disasm_window'] = 1
let g:termdebug_config['disasm_window_height'] = 15
如果没有 g:termdebug_config,您可以使用let g:termdebug_disasm_window = 15
任何大于 1 的值都将把 Asm 窗口的高度设置为该值。如果当前窗口有足够的水平空间,它将被垂直分割,Asm 窗口将与源代码窗口并排显示(并且高度选项将不被使用)。let g:termdebug_config['variables_window'] = 1
let g:termdebug_config['variables_window_height'] = 15
如果没有 g:termdebug_config,您可以使用let g:termdebug_variables_window = 15
任何大于 1 的值都将把 Var 窗口的高度设置为该值。如果当前窗口有足够的水平空间,它将被垂直分割,Var 窗口将与源代码窗口并排显示(并且高度选项将不被使用)。CTRL-C
中断正在运行的程序。但是在使用 MI 命令 "-exec-continue" 后,按下 CTRL-C
不会中断。因此,您将看到 "continue" 被用于 :Continue
命令,而不是使用通信通道。:Termdebug
之前设置 g:termdebug_config 中的 "debugger" 条目或 "g:termdebugger" 变量let g:termdebug_config['command'] = "mygdb"
如果没有 g:termdebug_config,您可以使用let g:termdebugger = "mygdb"
如果命令需要参数,请使用列表let g:termdebug_config['command'] = ['rr', 'replay', '--']
如果没有 g:termdebug_config,您可以使用let g:termdebugger = ['rr', 'replay', '--']
如果您是鼠标用户,您还可以使用您的右键单击定义一个映射到一个终端命令,例如评估光标下的变量nnoremap <RightMouse> :Evaluate<CR>
或者设置/取消设置断点nnoremap <RightMouse> :Break<CR>
将添加几个参数来使 gdb 能够很好地工作。如果您想修改它们,请添加一个函数来过滤参数列表let g:termdebug_config['command_filter'] = MyDebugFilter
如果您不想添加参数,但需要设置 "pty",请使用一个函数来添加必要的参数let g:termdebug_config['command_add_args'] = MyAddArguments
该函数将使用到目前为止的参数列表调用,以及作为第二个参数的 pty 的名称。 gdb-versionmap ,w :call TermDebugSendCommand('where')<CR>
参数是 gdb 命令。:Break
Clear breakpoint :Clear
Evaluate :Evaluate
如果你不想要这样,就用它来禁用它let g:termdebug_config['popup'] = 0
如果没有 g:termdebug_config,您可以使用let g:termdebug_popup = 0
let g:termdebug_config['sign'] = '>>'
如果没有 g:terminal_config,您可以使用let g:termdebug_config = {'sign': '>>'}
此后,断点将在符号列中显示为 >>
。let g:termdebug_config['wide'] = 163
如果没有 g:termdebug_config,您可以使用let g:termdebug_wide = 163
这将把 'columns' 设置为 163,当使用 :Termdebug
时。在退出调试器时,该值将被恢复。