Nvim 的 :help
頁面,產生自 原始碼,並使用 tree-sitter-vimdoc 解析器。
:edit term://bash
:vsplit term://top
autocmd VimEnter * ++nested split term://sh
term://{cwd}//{pid}:{cmd}
的形式命名。此命名方式會被 `:mksession` 用來還原終端機緩衝區(藉由重新啟動 {cmd}
)。<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}
autocmd TermClose * echom 'Terminal exited with status '..v:event.status
使用 jobwait() 來檢查終端機工作是否已完成。let running = jobwait([&channel], 0)[0] == -1
: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 " 標記將會出現在設定中斷點的 signcolumn 中。除錯器停止的行會被高亮顯示。你現在可以逐步執行程式。你會看到高亮顯示隨著除錯器執行一行原始程式碼而移動。print *eap如果滑鼠指標移動正常,當滑鼠停留在可被 gdb 評估的文字上時,Vim 也會顯示提示框。您也可以使用 "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
命令,或使用「清除斷點」的右鍵選單項目。:Evaluate
評估游標下的表達式 K
相同 (請參閱 termdebug_map_K 來停用) :Evaluate
{expr}
評估 {expr}
:'<,'>Evaluate
評估視覺選取的文字: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 的值都會將反組譯碼視窗的高度設定為該值。如果目前視窗有足夠的水平空間,它會被垂直分割,且反組譯碼視窗會與原始碼視窗並排顯示 (且不會使用高度選項)。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 的值都會將變數視窗的高度設定為該值。如果目前視窗有足夠的水平空間,它會被垂直分割,且變數視窗會與原始碼視窗並排顯示 (且不會使用高度選項)。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-版本map ,w :call TermDebugSendCommand('where')<CR>
參數是 gdb 命令。:Break
清除斷點 :Clear
評估 :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
這將在使用 :Termdebug
時將 欄數 設定為 163。退出偵錯程式時,該值將恢復。