有關教學課程和使用概述,請造訪 Vimspector 網站。
有關.vimspector.json
格式的詳細說明,請參閱參考指南。
該插件是一個適用於多種語言的 Vim 圖形調試器。它主要針對 C++、Python 和 TCL 進行測試,但理論上支援 Visual Studio Code 支援的任何語言(但請參閱注意事項)。
Vimspector 網站提供了 UI 概述以及配置和設定的基本說明。
但現在,這是 Vimspector 調試 Vim 的(相當舊的)截圖:
還有一些簡短的演示:
<Plug>VimspectorBalloonEval
)下表列出了「內建」語言(及其執行時間依賴項)。他們根據支持程度進行分類:
Tested
:完全支持,Vimspector 回歸測試涵蓋了它們Supported
:完全支援、經常使用且經過手動測試Experimental
:可以工作,但不常使用且很少測試Legacy
:不再支持,請遷移您的配置Retired
:不再包含或支持。語言 | 地位 | 開關(用於install_gadget.py ) | 適配器(用於:VimspectorInstall ) | 依賴關係 |
---|---|---|---|---|
C、C++、Rust、Jai 等 | 已測試 | --all 或--enable-c (或 cpp) | vscode-cpp工具 | 單核 |
C、C++、Rust、Jai 等 | 已測試 | --enable-rust 、 --enable-c 等 | 程式碼LLDB | 沒有任何 |
Python | 已測試 | --all 或--enable-python | 偵錯程式 | 蟒蛇3 |
去 | 已測試 | --enable-go | 鑽研 | 去1.16+ |
TCL | 支援 | --all 或--enable-tcl | tclpro | TCL 8.5 |
伯恩殼牌 | 支援 | --all 或--enable-bash | vscode-bash-調試 | 重擊v?? |
盧阿 | 已測試 | --all 或--enable-lua | 本地 lua 調試器 vscode | 節點 >=12.13.0、Npm、Lua 解釋器 |
Node.js | 支援 | --force-enable-node | vscode-js-調試 | 節點 >= 18 |
JavaScript | 支援 | --force-enable-chrome | chrome 偵錯工具 | 鉻合金 |
JavaScript | 支援 | --force-enable-firefox | vscode-firefox-調試 | 火狐瀏覽器 |
爪哇 | 支援 | --force-enable-java | vscode-java-調試 | 相容的LSP插件(見下文) |
PHP | 實驗性的 | --force-enable-php | vscode-php-調試 | 節點、PHP、XDEBUG |
C#(dotnet 核心) | 已測試 | --force-enable-csharp | 網路核心資料庫 | 點網核心 |
F#、VB 等 | 支援 | --force-enable-[fsharp,vbnet] | 網路核心資料庫 | 點網核心 |
去(遺留) | 遺產 | --enable-go | vscode-go | 節點、Go、Delve |
蟒蛇2 | 遺產 | --force-enable-python2 | 調試Python2 | Python 2.7 |
Vimspector 應該適用於在 Visual Studio Code 中工作的任何偵錯適配器。
若要將 Vimspector 與非「內建」語言一起使用,請參閱此 wiki 頁面。
有2種安裝方法:
:help packages
。packadd! vimspector
到您的.vimrc
.vimspector.json
或設定g:vimspector_configurations
) - 請參閱參考指南檢查依賴關係
請參閱外掛程式管理器的文件並安裝外掛程式 對於 Vundle,請使用:
Plugin ' puremourning/vimspector '
安裝一些“小工具”(調試適配器) - 請參閱此處以了解安裝命令並選擇要安裝的小工具
配置專案的偵錯設定檔(建立.vimspector.json
或設定g:vimspector_configurations
) - 請參閱參考指南
以下各節對上述簡要概述進行了擴展。
Vimspector 要求:
哪些 Linux 版本?我只在 Ubuntu 20.04 及更高版本和 RHEL 7 上進行測試。
neovim 不實現滑鼠懸停氣球。相反,有<Plug>VimspectorBalloonEval
映射。沒有預設的映射,所以我建議像這樣在彈出視窗中顯示變數:
" mnemonic 'di' = 'debug inspect' (pick your own, if you prefer!)
" for normal mode - the word under the cursor
nmap <Leader> di <Plug> VimspectorBalloonEval
" for visual mode, the visually selected text
xmap <Leader> di <Plug> VimspectorBalloonEval
Windows 未實現以下功能:
如果您只想嘗試 vimspector 而不更改 vim 配置, support/test
中有多種語言的範例項目,包括:
要測試其中之一,請 cd 到該目錄並運行:
vim -Nu /path/to/vimspector/tests/vimrc --cmd "let g:vimspector_enable_mappings='HUMAN'"
然後按<F5>
。
tests/testdata/cpp/simple/
中還有一個 C++ 項目,其中包含一個Makefile
,可用來檢查一切是否正常。這是由 CI 中的回歸測試使用的,因此應該始終有效,並且是檢查問題是否是您的配置而不是錯誤的好方法。
Vim 外掛程式管理器有很多,我不會說明特定的偏好,因此如果您選擇使用一個,請遵循插件管理器的文件。例如,對於 Vundle,請使用:
Plugin ' puremourning/vimspector '
如果您還沒有使用外掛程式管理器,請透過將此儲存庫複製到您的套件路徑中來安裝 vimspector 作為 Vim 套件,如下所示:
$ git clone https://github.com/puremourning/vimspector ~/.vim/pack/vimspector/opt/vimspector
.vimrc
中設定 vimspector,例如啟用標準映射: let g: vimspector_enable_mappings = ' HUMAN '
.vimrc
: packadd! vimspector
有關最小範例,請參閱support/doc/example_vimrc.vim
。
Vimspector 是調試適配器的通用客戶端。調試適配器(稱為“小工具”或“適配器”)實際上負責與真正的調試器通訊。
為了讓 Vimspector 有用,您需要安裝一些轉接器。
有幾種方法可以做到這一點:
:VimspectorInstall <adapter> <args...>
(使用 TAB wildmenu
檢視選項,也接受任何install_gadget.py
選項)python3 install_gadget.py <args>
(使用--help
查看所有選項):VimspectorUpdate
安裝支援的最新版本的小工具。這是進行一些安裝和升級的演示:
install_gadget.py
和:VimspectorInstall
都執行相同的操作,但預設行為略有不同。對於支援的語言,他們將:
gadgetDir
符號連結。例如,要安裝某種語言的經過測試的調試適配器,請執行:
安裝 | 腳本 | 命令 |
---|---|---|
<adapter> | :VimspectorInstall <adapter> | |
<adapter1> 、 <adapter2> 、... | :VimspectorInstall <adapter1> <adapter2> ... | |
<language> | ./install_gadget.py --enable-<language> ... | :VimspectorInstall --enable-<language> ... |
支援的適配器 | ./install_gadget.py --all | :VimspectorInstall --all |
支援的適配器,但 TCL 不支援 | ./install_gadget.py --all --disable-tcl | :VimspectorInstall --all --disable-tcl |
支援的和實驗性的適配器 | ./install_gadget.py --all --force-all | :VimspectorInstall --all |
用於特定調試配置的適配器 | 開始調試時由 Vimspector 建議 |
:VimspectorInstall
在背景執行install_gadget.py
並使用一些預設選項。
:VimspectorUpdate
運行install_gadget.py
來重新安裝(即更新)已安裝在.gadgets.json
中的任何小工具。
輸出很小,要查看完整輸出,請在命令中新增--verbose
,如:VimspectorInstall --verbose ...
或:VimspectorUpdate --verbose ...
。
如果安裝成功,輸出視窗將關閉(並且輸出將永遠丟失)。使用一個!
保持其開啟狀態(例如:VimspectorInstall! --verbose --all
或:VimspectorUpdate!
(等)。
如果您事先知道要安裝哪些小工具,例如以便可以從原始程式碼控制重現您的配置,則可以將g:vimspector_install_gadgets
設定為小工具清單。這將在以下情況下使用:
:VimspectorInstall
,或者:VimspectorUpdate
例如:
let g: vimspector_install_gadgets = [ ' debugpy ' , ' vscode-cpptools ' , ' CodeLLDB ' ]
預設情況下, install_gadget.py
將使用剛安裝的一組適配器覆蓋.gadgets.json
,而:VimspectorInstall
將更新它,僅覆蓋新更改或安裝的適配器。
如果您只想使用腳本新增適配器而不破壞現有適配器,請新增--update-gadget-config
,如下所示:
$ ./install_gadget.py --enable-tcl
$ ./install_gadget.py --enable-rust --update-gadget-config
$ ./install_gadget.py --enable-java --update-gadget-config
如果您想要維護 vimspector 儲存庫以外的configurations
(如果您有自訂小工具或全域配置,這可能很有用),您可以告訴安裝程式使用不同的 basedir,然後設定g:vimspector_base_dir
指向該目錄,例如:
$ ./install_gadget.py --basedir $HOME /.vim/vimspector-config --all --force-all
然後將其新增至您的.vimrc
:
let g: vimspector_base_dir = expand ( ' $HOME/.vim/vimspector-config ' )
使用:VimspectorInstall
時,將遵循g:vimspector_base_dir
設置,除非手動添加--basedir
(不建議)。
有關各種選項的更多信息,請參閱--help
。
如果您要偵錯的語言不在上面支援的清單中,您可能仍然可以使其工作,但需要付出更多的努力。
您本質上需要獲得調試適配器的有效安裝,了解如何啟動它,並在.vimspector.json
或.gadgets.json
或g:vimspector_adapters
adapters
條目中進行配置。
實務上最簡單的方法是安裝或啟動 Visual Studio Code 並使用其擴充功能管理器來安裝相關擴充功能。然後,您可以在.vimspector.json
的adapters
部分、 gadgets.json
或g:vimspector_adapters
中手動配置適配器。
始終歡迎 PR 添加支援的語言(大致翻譯為更新python/vimspector/gadgets.py
並測試它)。
Vimspector 預設使用以下目錄來尋找名為.gadgets.json
的檔案: </path/to/vimspector>/gadgets/<os>
。
該路徑以 vimspector變數${gadgetDir}
公開。這對於配置小工具命令列非常有用。
其中 os 是以下之一:
macos
linux
windows
(但請注意:不支援 Windows)格式與.vimspector.json
相同,但僅使用adapters
金鑰:
例子:
{
"adapters" : {
"lldb-vscode" : {
"variables" : {
"LLVM" : {
"shell" : " brew --prefix llvm "
}
},
"attach" : {
"pidProperty" : " pid " ,
"pidSelect" : " ask "
},
"command" : [
" ${LLVM}/bin/lldb-vscode "
],
"env" : {
"LLDB_LAUNCH_FLAG_LAUNCH_IN_TTY" : " YES "
},
"name" : " lldb "
},
"vscode-cpptools" : {
"attach" : {
"pidProperty" : " processId " ,
"pidSelect" : " ask "
},
"command" : [
" ${gadgetDir}/vscode-cpptools/debugAdapters/bin/OpenDebugAD7 "
],
"name" : " cppdbg "
}
}
}
小工具檔案由install_gadget.py
(或:VimspectorInstall
)自動寫入。
Vimspector 也會載入任何符合的檔案: </path/to/vimspector>/gadgets/<os>/.gadgets.d/*.json
。它們的格式與.gadgets.json
相同,但在執行install_gadget.py
時不會被覆寫。
更新 Vimspector 程式碼(透過git pull
或任何套件管理器)後,執行:VimspectorUpdate
來更新任何已安裝的小工具。
其動機是,在 Vim 中進行偵錯是一種非常糟糕的體驗,特別是當您使用多種語言時。由於 pyclewn 不再存在並且內建 termdebug 外掛僅限於 gdb,我想探索一些選項。
雖然語言伺服器協定眾所周知,但偵錯適配器協定不太為人所知,但實現了類似的目標:與語言無關的 API 從客戶端抽象化偵錯器。
該專案的目標是透過利用為 Visual Studio Code 建置的偵錯適配器,在 Vim 中為多種語言提供簡單但有效的偵錯體驗。
進行遠端調試的能力是必須的。這是我的工作流程的關鍵,因此將其融入調試體驗是專案的首要目標。因此,vimspector 對遠端執行程式和附加程式具有一流的支援。這種支援是 vimspector 所獨有的,並且是實際調試適配器中任何此類支援的補充(補充)。
Vimspector 是一個基於偵錯適配器協定的 vim UI。它的目的是為日常調試任務提供高水準和方便。
Vimspector 不是:
Vimspector 是一項正在進行中的工作,非常歡迎任何回饋/貢獻。
可以在 Trello 上查看待辦事項清單。
該插件目前處於實驗階段。這意味著它的任何部分都可以(並且可能)改變,包括:
不過,我承諾僅在最極端的情況下才這樣做,並提前在 Gitter 上宣布此類更改。沒有什麼比破壞你的東西更煩人的了。我明白了。
作者關於此外掛動機的消息:
許多開發環境都有內建的調試器。我在 Vim 上花費了大量的時間。我在 Vim 中完成所有開發,甚至客製了建置程式碼、運行測試等的工作流程。
多年來,我觀察到自己、朋友和同事一直在各種文件中編寫
printf
、puts
、我堅信,互動式圖形調試環境是理解和推理不熟悉和熟悉程式碼的最佳方式,缺乏對調試器的現成、簡單訪問對許多人來說是一個巨大的隱藏生產力漏洞。
不要誤會我的意思,我知道實際上有數以百萬計的開發人員在沒有圖形調試器的情況下完全有能力進行開發,但我堅持認為,如果他們能夠只按一個鍵並跳到調試器,那麼會比僅僅透過大腦理解程式碼更快、更有趣。
我建立 Vimspector 是因為我發現更改工具令人沮喪。
gdb
用於 c++,pdb
用於 python 等。每個都有自己的字典。每個人都有自己的缺點。我設計的配置系統的方式是可以將配置提交給原始程式碼控制,以便它只適用於您的任何同事、朋友、合作者或完全陌生的人。
我將遠端調試作為一流的功能,因為這是我工作中的主要用例。
借助 Vimspector,我可以在我開發的所有語言中按
<F5>
,並使用完全相同的工作流程、映射和 UI 在本地或遠端進行偵錯。我已將其與 Vim 集成,這樣我就可以點擊按鈕並在 Vimspector 中的遊標下運行測試。這種整合極大地改善了我的工作流程和生產力。它甚至使學習新程式碼庫的過程變得......有趣。- 本·傑克遜,創作者。
阿帕契2.0
版權所有 © 2018 本傑克遜
如果您非常喜歡 Vimspector 以至於願意捐出自己辛苦賺來的錢,請考慮捐贈給以下慈善機構之一,這些機構對 Vimspector 的作者有意義(按優先順序排列):
預設情況下,vimspector 不會更改任何映射。映射是非常個人化的,所以你應該找出你喜歡的,並使用 vim 強大的映射功能來設定你自己的映射。為此,Vimspector 定義了以下<Plug>
映射:
測繪 | 功能 | 應用程式介面 |
---|---|---|
<Plug>VimspectorContinue | 調試時,繼續。否則開始調試。 | vimspector#Continue() |
<Plug>VimspectorStop | 停止調試。 | vimspector#Stop() |
<Plug>VimpectorRestart | 使用相同的配置重新啟動調試。 | vimspector#Restart() |
<Plug>VimspectorPause | 暫停調試程序。 | vimspector#Pause() |
<Plug>VimspectorBreakpoints | 顯示/隱藏斷點視窗 | vimspector#ListBreakpoints() |
<Plug>VimspectorToggleBreakpoint | 在當前行切換行斷點。 | vimspector#ToggleBreakpoint() |
<Plug>VimspectorToggleConditionalBreakpoint | 切換目前行上的條件行斷點或日誌點。 | vimspector#ToggleBreakpoint( { trigger expr, hit count expr } ) |
<Plug>VimspectorAddFunctionBreakpoint | 為遊標下的表達式新增函數斷點 | vimspector#AddFunctionBreakpoint( '<cexpr>' ) |
<Plug>VimspectorGoToCurrentLine | 將目前程式計數器重設為目前行 | vimspector#GoToCurrentLine() |
<Plug>VimspectorRunToCursor | 運行到遊標處 | vimspector#RunToCursor() |
<Plug>VimspectorStepOver | 跨過 | vimspector#StepOver() |
<Plug>VimspectorStepInto | 步入 | vimspector#StepInto() |
<Plug>VimspectorStepOut | 跳出目前函數範圍 | vimspector#StepOut() |
<Plug>VimspectorDisassemble | 顯示拆解。啟用指令步進 | vimspector#ShowDisassembly() |
<Plug>VimspectorUpFrame | 在當前呼叫堆疊中上移一幀 | vimspector#UpFrame() |
<Plug>VimspectorDownFrame | 在當前呼叫堆疊中下移一幀 | vimspector#DownFrame() |
<Plug>VimspectorJumpToNextBreakpoint | 將遊標移到目前文件中的下一個斷點 | vimspector#JumpToNextBreakpoint() |
<Plug>VimspectorJumpToPreviousBreakpoint | 將遊標移到目前檔案中的上一個斷點 | vimspector#JumpToPreviousBreakpoint() |
<Plug>VimspectorJumpToProgramCounter | 將遊標移到目前影格的程式計數器 | vimspector#JumpToProgramCounter() |
<Plug>VimspectorBalloonEval | 評估彈出視窗中遊標(或視覺)下的表達式 | 內部的 |
這些與下面的 API 函數大致 1-1 對應。
例如,如果您希望<F5>
開始/繼續調試,請將其新增至某個適當的位置,例如vimrc
(提示: run :e $MYVIMRC
)。
nmap <F5> <Plug> VimspectorContinue
此外,許多使用者可能只想在偵錯處於活動狀態時啟用某些 Vimspector 對應。這也是可能的,儘管它需要編寫一些 vimscipt。
也就是說,許多人熟悉特定的偵錯器,因此可以透過將g:vimspector_enable_mappings
設定為指定值來啟用以下映射。
若要使用類似 Visual Studio 的映射,請在載入 vimspector 之前將以下內容新增至vimrc
:
let g: vimspector_enable_mappings = ' VISUAL_STUDIO '
鑰匙 | 測繪 | 功能 |
---|---|---|
F5 | <Plug>VimspectorContinue | 調試時,繼續。否則開始調試。 |
Shift F5 | <Plug>VimspectorStop | 停止調試。 |
Ctrl Shift F5 | <Plug>VimspectorRestart | 使用相同的配置重新啟動調試。 |
F6 | <Plug>VimspectorPause | 暫停調試程序。 |
F8 | <Plug>VimspectorJumpToNextBreakpoint | 跳到目前文件中的下一個斷點。 |
Shift F8 | <Plug>VimspectorJumpToPreviousBreakpoint | 跳到目前文件中的上一個斷點。 |
F9 | <Plug>VimspectorToggleBreakpoint | 在當前行切換行斷點。 |
Shift F9 | <Plug>VimspectorAddFunctionBreakpoint | 為遊標下的表達式新增函數斷點 |
F10 | <Plug>VimspectorStepOver | 跨過 |
Ctrl F10 | <Plug>VimspectorRunToCursor | 運行到遊標* |
F11 | <Plug>VimspectorStepInto | 步入 |
Shift F11 | <Plug>VimspectorStepOut | 跳出目前函數範圍 |
Alt 8 | <Plug>VimspectorDisassemble | 顯示拆解 |
注意:某些映射(例如 ctrl 和 F 鍵)可能無法運作,具體取決於您的終端、鍵盤、視窗系統和各種其他東西。請參閱:help modifyOtherKeys
和其他來源。如果您無法完成此操作,只需使用“人類模式”映射即可。
如果你像我一樣只有 2 隻手和 10 個手指,你可能不喜歡 Ctrl-Shift-F 鍵。另外,如果您在終端機中運行,則轉移 F 鍵的 terminfo 很可能是錯誤的,特別是如果您的TERM
是screen-256color
。如果這些問題(手數、 TERM
變數)無法修復,請嘗試以下映射,在載入 vimspector 之前新增以下內容:
let g: vimspector_enable_mappings = ' HUMAN '
鑰匙 | 測繪 | 功能 |
---|---|---|
F5 | <Plug>VimspectorContinue | 調試時,繼續。否則開始調試。 |
F3 | <Plug>VimspectorStop | 停止調試。 |
F4 | <Plug>VimspectorRestart | 使用相同的配置重新啟動調試。 |
F6 | <Plug>VimspectorPause | 暫停調試程序。 |
F9 | <Plug>VimspectorToggleBreakpoint | 在當前行切換行斷點。 |
<leader>F9 | <Plug>VimspectorToggleConditionalBreakpoint | 切換目前行上的條件行斷點或日誌點。 |
F8 | <Plug>VimspectorAddFunctionBreakpoint | 為遊標下的表達式新增函數斷點 |
<leader>F8 | <Plug>VimspectorRunToCursor | 運行到遊標處 |
F10 | <Plug>VimspectorStepOver | 跨過 |
F11 | <Plug>VimspectorStepInto | 步入 |
F12 | <Plug>VimspectorStepOut | 跳出目前函數範圍 |
此外,我建議在正常和可視模式下添加到<Plug>VimspectorBalloonEval
的映射,例如:
" mnemonic 'di' = 'debug inspect' (pick your own, if you prefer!)
" for normal mode - the word under the cursor
nmap <Leader> di <Plug> VimspectorBalloonEval
" for visual mode, the visually selected text
xmap <Leader> di <Plug> VimspectorBalloonEval
您可能還想添加用於在堆疊中向上/向下導航、切換斷點視窗以及顯示反彙編的映射,例如:
nmap <LocalLeader> <F11> <Plug> VimspectorUpFrame
nmap <LocalLeader> <F12> <Plug> VimspectorDownFrame
nmap <LocalLeader> B <Plug> VimspectorBreakpoints
nmap <LocalLeader> D <Plug> VimspectorDisassemble
本節定義了按功能組織的詳細使用說明。對於大多數使用者來說,映射部分包含最常用的命令和預設用法。本部分可用作建立您自己的映射或自訂行為的參考。
以下所有說明均假設單一偵錯會話。有關如何同時偵錯多個獨立應用程式的詳細信息,請參閱[多個偵錯會話][#multiple-debugging-sessions]。
.vimspector.json
。見下文。:call vimspector#Launch()
並選擇一個配置。啟動新會話使其成為活動的[偵錯會話][#multiple-debugging-sessions]。
如果偵錯適配器配置使用pidProperty
,並且您發出attach
請求,則系統會要求您輸入要附加的 PID(進程 ID)。
為了使這更容易,Vimspector 提供了一些用於列出 PID 的實用程式。它就像ps
的非常非常簡單的克隆,但可以在所有支援的平台上運行。有關設定的說明,請參閱其自述文件。
在support/vimspector_process_list
目錄中執行go build
進行設定。
如果 Vimspector 能夠找到此應用程序,它會預設嘗試列出當前使用者擁有的所有進程。
或者(最好是),您可以使用一種特殊形式的變數擴展,稱為${PickProcess("binaryName")}
。此呼叫的版本將列出目前使用者與此二進位名稱相符的所有進程。
例如:
"Attach" : {
"adapter" : "CodeLLDB" ,
"configuration" : {
"request" : "attach" ,
"program" : "${workspaceRoot}/Jails" ,
"pid" : "${PickProcess("jails")}"
}
}
這將列出每個符合的進程、其父進程、啟動時間和工作目錄。它看起來像這樣:
PID PPID CWD START
52218 52217 (Python) /Users/ben/.vim/bundle/lsp-examples/jai/Jails 2023-05-22 16:02:24
Enter Process ID:
然後輸入 PID 並點選<CR>
。
您甚至可以用自己的函數替換進程選擇器。如果定義某個函數並將g:vimspector_custom_process_picker_func
設定為該函數的名稱。它將傳遞傳遞給PickProcess
擴展函數的任何參數。每當指定pidProperty
時也會使用它,因此它也必須不處理任何參數(使用...
作為函數的正式參數,請參閱:help ...
)。
例如,要將fzf
與提供的vimspector_process_list
一起使用:
function ! CustomPickProcess ( ... ) abort
let ps = $HOME .. ' /.vim/bundle/vimspector/support/vimspector_process_list/vimspector_process_list '
" a:0 is number of args
" a:1 is the optional binary name
if a: 0 > 0
let ps .= ' ^ ' . a: 1 . ' $ '
endif
let line_selected = fzf#run ( {
' source ' : ps ,
' options ' : ' --header-lines=1 '
. ' --prompt="Select Process: " '
,
} )[ 0 ]
if empty ( line_selected)
return 0
endif
let pid = split ( line_selected )[ 0 ]
return str2nr ( pid )
endfunction
let g: vimspector_custom_process_picker_func = ' CustomPickProcess '
或將fzf
與ps
的輸出一起使用:
function ! CustomPickProcess ( ... ) abort
let ps = ' ps aux '
let line_selected = fzf#run ( {
' source ' : ps ,
' options ' : ' --header-lines=1 '
. ' --prompt="Select Process: " '
,
} )[ 0 ]
if empty ( line_selected)
return 0
endif
let pid = split ( line_selected )[ 0 ]
return str2nr ( pid )
endfunction
let g: vimspector_custom_process_picker_func = ' CustomPickProcess '
若要啟動特定的偵錯配置,或指定啟動的替換變數,您可以使用:
:call vimspector#LaunchWithSettings( dict )
參數是一個具有以下鍵的dict
:
configuration
:(可選)要啟動的調試配置的名稱<anything else>
:(可選)要設定的變數的名稱這允許一定程度的整合和自動化。例如,如果您有一個名為Run Test
配置,其中包含名為${Test}
的替換變量,您可以編寫一個最終執行的映射:
vimspector#LaunchWithSettings ( #{ configuration: ' Run Test '
Test: ' Name of the test ' } )
這將啟動Run Test
配置,並將${Test}
設為'Name of the test'
,且 Vimspector不會提示使用者輸入或確認這些內容。
請參閱我們的 YouCompleteMe 整合指南,以了解另一個範例,其中可用於指定連接 java 偵錯器的連接埠
若要使用臨時配置啟動,您可以使用:
call vimspector#LaunchWithConfigurations( dict )
參數是一個dict
,它是 .vimspector 檔案的configurations
部分。傳入一項配置,該配置將被選為要執行的配置。例如:
let pid = <some_expression>
call vimspector#LaunchWithConfigurations ({
" attach " : {
" adapter " : " netcoredbg " ,
" configuration " : {
" request " : " attach " ,
" processId " : pid
}
}
} )
這將啟動偵錯器並附加到指定的進程,而不需要在磁碟上有本機 .vimspector 檔案。 ${workspaceRoot}
變數將指向目前在 vim 中開啟的檔案的父資料夾。
Vimspector 使用下列邏輯來選擇要啟動的設定:
autoselect
設為false
,請使用它。default
為true
且沒有將autoselect
設為false
,請使用該配置。有關詳細信息,請參閱參考指南。
vimspector#GetConfigurations()
取得目前緩衝區檔案類型的設定列表例如,取得配置數組和結果的模糊匹配
: call matchfuzzy ( vimspector#GetConfigurations (), " test::case_1 " )
有關使用斷點的預設映射,請參閱映射部分。本節介紹 vimscript 函數中的完整 API。
斷點與目前的[偵錯會話][#multiple-debugging-sessions]相關聯。在會話之間切換時,前一個會話的斷點標誌將被刪除,並顯示新啟動會話的斷點。雖然查看所有會話的斷點可能很有用,但這可能會非常令人困惑。
使用:VimspectorBreakpoints
或將某些內容對應到<Plug>VimspectorBreakpoints
以開啟斷點視圖。從這裡您可以列出、跳到刪除、新增和切換斷點。
我建議使用這樣的映射來切換斷點視窗:
nmap <Leader> db <Plug> VimspectorBreakpoints
預設情況下,斷點視窗中套用以下映射:
t
, <F9>
- 切換,即啟用/停用斷點T
- 切換,即啟用/停用所有斷點dd
, <Del>
- 刪除目前斷點cc
, C
- 編輯目前斷點選項i
, a
, o
- 新增行斷點I
, A
, O
- 增加新的函數斷點<Enter>
或雙擊 - 跳到該行斷點還提供了 WinBar(如果支援)。這增加了保存/恢復會話、清除所有斷點和重置異常斷點選項等功能。
斷點最簡單且最常見的形式是行斷點。執行指定行時,執行暫停。
對於大多數偵錯場景,使用者只需按<F9>
在目前行上建立行斷點,然後按<F5>
啟動應用程式。
一些調試適配器支援條件斷點。請注意,vimspector 不會告訴您偵錯器是否不支援條件斷點(尚)。條件斷點是僅在某些表達式計算結果為 true 或滿足某些其他約束時觸發的斷點。
上面的一些函數採用單一可選參數,它是選項字典。字典可以有以下按鍵:
condition
:評估一個可選表達式以確定是否應觸發斷點。並非所有調試適配器都支援。例如,要在abc
為10
時中斷,請輸入類似abc == 10
內容,視語言而定。hitCondition
:一個可選表達式,用於決定應忽略斷點的次數。不應該(可能?)不與condition
結合使用。並非所有調試適配器都支援。例如,要在第三次觸及該行時中斷,請輸入3
。logMessage
:可選字串,使該斷點成為「日誌點」。觸發時,該訊息將列印到控制台而不是中斷執行。您可以在大括號中嵌入表達式{like this}
,例如#{ logMessage: "Iteration {i} or {num_entries / 2}" }
在每種情況下,表達式都是由調試器計算的,因此在計算表達式時應該採用調試器理解的任何方言。
使用<leader><F9>
映射時,系統會提示使用者在命令列中輸入這些表達式(包含歷史記錄)。
異常斷點通常在引發異常或發生其他錯誤情況時觸發。根據偵錯器的不同,開始偵錯時,可能會詢問您一些有關如何處理異常的問題。這些是“異常斷點”,當 Vim 仍在運行時,vimspector 會記住您的選擇。
通常,您可以接受預設值(只需按住<CR>
!),因為大多數偵錯適配器預設值都是正常的,但如果您想繼續,請說uncaught exception
,然後回答Y
(例如)。
您可以在.vimspector.json
中配置您的選擇。有關詳細信息,請參閱配置指南。
注意:以前,ToggleBreakpoint 會在 3 種狀態之間循環:啟用、停用、刪除。許多用戶發現「停用」狀態很少有用,因此行為已被更改。 ToggleBreakpoint 始終建立或刪除斷點。如果您希望「停用」斷點,請使用斷點視窗並從那裡「切換」( t
)。
vimspector#ToggleBreakpoint( { options dict } )
設定/刪除行斷點。此參數是可選的(見下文)。vimspector#AddFunctionBreakpoint( '<name>', { options dict} )
加入函數斷點。第二個參數是可選的(見下文)。vimspector#SetLineBreakpoint( file_name, line_num, { options dict } )
在特定檔案/行處設定斷點。最後一個參數是可選的(見下文)vimspector#ClearLineBreakpoint( file_name, line_num )
刪除特定檔案/行處的斷點vimspector#ClearBreakpoints()
清除所有斷點vimspector#ResetExceptionBreakpoints()
清除異常斷點配置並重新回答各種問題,例如“Break on C++ Throw”:VimspectorMkSession
和:VimspectorLoadSession
儲存和還原斷點call vimspector#ListBreakpoints()
- 切換斷點窗口call vimspector#BreakpointsAsQuickFix()
- 以 vim 快速修復格式傳回目前斷點集範例:
call vimspector#ToggleBreakpoint()
- 在目前行切換斷點call vimspector#SetLineBreakpoint( 'some_file.py', 10 )
- 在some_filepy:10
上設定斷點call vimspector#AddFunctionBreakpoint( 'main' )
- 在main
函數上新增函數斷點call vimspector#ToggleBreakpoint( { 'condition': 'i > 5' } )
- 在目前行新增一個斷點,僅當i > 5
為true
時才會觸發call vimspector#SetLineBreakpoint( 'some_file.py', 10, { 'condition': 'i > 5' } )
- 在some_file.py:10
新增一個斷點,只有當i > 5
為true
時才會觸發call vimspector#ClearLineBreakpoint( 'some_file.py', 10 )
- 刪除some_file.py:10
處的斷點call vimspector#ClearBreakpoints()
- 清除所有斷點VimspectorMkSession
- 建立.vimspector.session
VimspectorLoadSession
- 讀取.vimspector.session
VimspectorMkSession my_session_file
- 建立my_session_file
VimspectorLoadSession my_session_file
- 讀取my_session_file
注意:實驗性功能,將來可能會根據使用者回饋而發生重大變化。
可以從反彙編視窗中新增指令斷點,其方式與在程式碼視窗中新增行斷點相同。相同的映射和函數可用於新增和切換它們。在偵錯適配器支援的情況下,您甚至可以透過這種方式建立日誌點和條件斷點。
目前,指令斷點在內部建模為針對包含反彙編的緩衝區的行斷點,但將來可能會發生變化,因此請不要依賴於此。
指令斷點在斷點視窗中也是可見的,並且可以從斷點視窗中刪除/停用。
目前,當偵錯會話結束時,指令斷點會自動清除。原因是無法保證這些位址對於任何其他偵錯會話都有效。然而,這種情況將來也可能會改變。
使用vimspector#ClearBreakpoints()
清除所有斷點,包括異常斷點選擇的記憶體。
使用vimspector#RunToCursor
或<leader><F8>
:這會在目前行上建立一個臨時斷點,然後繼續執行,並在命中時清除斷點。
使用vimspector#GoToCurrentLine()
或一些到<Plug>VimspectorGoToCurrentLine
的對應將目前執行跳到遊標目前所在的行。
在支援的情況下,這對於重新運行程式碼部分或完全跳過它們可能很有用。
如果目前行有多個可能的“目標”,系統會提示您選擇一個。
Vimspector 可以將斷點(以及其他一些內容)儲存和還原到會話檔案中。為此存在以下命令:
VimspectorMkSession [file/dir name]
- 將目前的行斷點、日誌點、條件斷點、函數斷點和異常斷點過濾器集儲存到提供的會話檔案或提供的目錄中的預設檔案。VimspectorLoadSession [file/dir name]
- 從提供的會話檔案或提供的目錄中的預設檔案讀取斷點,並取代任何目前設定的斷點。在載入之前,所有目前斷點都會被清除(就像呼叫了vimspector#ClearLineBreakpoints()
一樣)。在這兩種情況下,檔案/目錄名稱參數都是可選的。預設情況下,該檔案名稱為.vimspector.session
,但可以透過將g:vimspector_session_file_name
設定為其他內容或在呼叫命令時手動指定路徑來全域變更此檔案。如果您提供目錄,將從該目錄讀取或寫入預設或配置的會話檔案名稱。否則,根據目前開啟的緩衝區讀取檔案或寫入目前工作目錄。
高級用戶可能希望自動化載入和儲存過程,例如透過新增VimEnter
和VimLeave
自動命令。在這種情況下建議使用silent!
以避免無法讀取或寫入檔案時出現煩人的錯誤。
最簡單的自動化形式是每當您使用會話檔案啟動 vim 時載入 vimspector 會話。這就像這樣做一樣簡單:
$ echo silent VimspectorLoadSession > Sessionx.vim
有關*x.vim
文件的詳細信息,請參閱:help mksession
。您也可以使用SessionLoadPost
執行類似的操作:
autocmd SessionLoadPost * silent ! VimspectorLoadSession
vimspector#StepSOver()
vimspector#StepInto()
vimspector#StepIOver()
。 <CR>
,或用滑鼠左鍵雙擊展開/折疊(+、-)。<C-CR>
(control + <CR>
) 或<leader><CR>
設定變數的值(如果modifyOtherKeys
不適合您)範圍和變數由緩衝區vimspector.Variables
表示。
如果您喜歡更詳細地顯示變數和監視,那麼您可以let g:vimspector_variables_display_mode = 'full'
。預設情況下,僅顯示名稱和值,其他資料可透過將滑鼠懸停或在變數(或監視)視窗中包含值的行上觸發<Plug>VimspectorBalloonEval
來取得。
Variables and scopes
的所有規則均適用,另外還包括以下內容:
a + b
)進行視覺選擇並取得其結果。nmap
) 和視覺模式 ( xmap
) 對應到<Plug>VimspectorBalloonEval
以手動觸發彈出視窗。<C-CR>
(control + <CR>
) 或<leader><CR>
設定變數的值(如果modifyOtherKeys
不適合您)j
, k
)選擇目前選項; <Esc>
(或離開工具提示視窗)可關閉工具提示。您可以在啟動偵錯會話之前透過設定g:vimspector_enable_auto_hover=0
來停用自動懸停彈出視窗。然後,您可以將某些內容對應到<Plug>VimspectorBalloonEval
並手動觸發它。
監視視窗用於檢查變數和表達式。表達式在選定的“集中”堆疊幀中進行計算
監視視窗是一個可用的提示緩衝區。進入插入模式以新增新的監視表達式。
<CR>
提交。:VimspectorWatch <expression>
。表達式的製表符補全功能在某些偵錯適配器中可用。<CR>
展開結果,或滑鼠左鍵雙擊。<C-CR>
(control + <CR>
) 或<leader><CR>
設定變數的值(如果modifyOtherKeys
不適合您)<DEL>
刪除。監視由緩衝區vimspector.Watches
表示。
如果您喜歡更詳細地顯示變數和監視,那麼您可以let g:vimspector_variables_display_mode = 'full'
。預設情況下,僅顯示名稱和值,其他資料可透過將滑鼠懸停或在變數(或監視)視窗中包含值的行上觸發<Plug>VimspectorBalloonEval
來取得。
在啟動偵錯會話之前,您可以透過設定g:vimspector_enable_auto_hover=0
來停用自動懸停彈出視窗。然後,您可以將某些內容對應到<Plug>VimspectorBalloonEval
並手動觸發它。
監視提示緩衝區將其omnifunc
設定為函數,該函數將計算目前表達式的完成情況。這通常與<Ctrl-x><Ctrl-o>
一起使用(請參閱:help ins-completion
),或與您最喜歡的完成系統整合。緩衝區中的檔案類型設定為VimspectorPrompt
。
對於 YouCompleteMe,以下配置效果很好:
let g: ycm_semantic_triggers = {
' VimspectorPrompt ' : [ ' . ' , ' -> ' , ' : ' , ' < ' ]
}
:VimspectorDisassemble
、 vimspector#ShowDisassembly()
或<Plug>VimspectorDisassemble
一些調試適配器(很少!)支援反彙編。它在 DAP 中的工作方式有點奇怪,但實際上 vimspector 會要求反彙編當前堆疊幀的 PC 周圍的許多指令。然後,它會顯示在一個帶有類似程式碼視窗的 WinBar 的視窗中,但具有指令步進粒度。當前指令有一個標誌,語法高亮預設為“asm”,這對於 x86 和 ARM 來說基本上可以正常工作。
如上所述,當您目前的視窗是反彙編視窗並且您使用預設的「step」命令(例如<F10>
)時,步進會自動變更為每個指令而不是每個語句。
每次進程停止時,vimspector 都會要求大約 2 個充滿目前 PC 周圍指令的視窗。要查看更多內容,您可以捲動視窗。當視窗滾動到頂部或接近底部時,Vimspector 將翻頁額外的一頁指令。這並不完美。有時您必須滾動更多一點才能使其翻頁(例如,在頂部按 ctrl-e ctrl-y)。這並不理想,未來可能會得到改善。
您可以使用let g:vimspector_disassembly_height = 10
(或任何行數)來控制反組譯視窗的初始高度。
反組譯視窗中緩衝區的檔案類型(和語法)是vimspector-disassembly
。您可以使用FileType
自動命令來自訂語法突出顯示等內容。
注意:此功能是實驗性的,可能會根據使用者回饋進行任何更改。
一些偵錯適配器提供了一種轉儲與變數關聯的進程記憶體的方法。這可以透過“變數”和“監視”視窗來完成:
<leader>m
映射(默認,可自訂)vimspector#ReadMemory()
函數執行此操作時,系統會要求您輸入要讀取的位元組數(從與目前遊標行關聯的位置)以及距離該位置的偏移量。程式碼視窗中顯示一個新緩衝區,其中包含十六進位和 ascii 格式的記憶體轉儲,類似於xxd
的輸出。
注意:此功能是實驗性的,可能會根據使用者回饋進行任何更改。
堆疊追蹤視窗顯示每個程式執行緒的狀態。可以展開已停止的執行緒以顯示該執行緒的堆疊追蹤。
通常,但並非總是,當遇到斷點時,所有執行緒都會停止。線程的狀態顯示在線程名稱後面的括號中。在底層偵錯器支援的情況下,可以在「堆疊追蹤」視窗中單獨暫停和繼續執行緒。
使用CursorLine
突出顯示群組突出顯示的特定線程是「聚焦」線程。這是在程式碼視窗中接收「Step In」、「Step Out」、「Continue」和「Pause」等指令的執行緒。可以手動更改聚焦線程以“切換到”該線程。
<CR>
,或用滑鼠左鍵雙擊來展開/折疊線程堆疊跟踪,或使用 WinBar 按鈕。<CR>
,或在堆疊幀上用滑鼠左鍵雙擊以跳到該堆疊幀。vimspector#PauseContinueThread()
單獨暫停或繼續選定的執行緒。<leader><CR>
或vimspector#SetCurrentThread()
將「焦點」執行緒設定為目前選定的執行緒。如果所選行是堆疊幀,則將焦點線程設定為該幀的線程,並在程式碼視窗中跳到該幀。堆疊追蹤由緩衝區vimspector.StackTrace
表示。
如果存在子偵錯會話,例如被偵錯者啟動子程序並且偵錯適配器支援多會話偵錯,則每個會話的執行緒將單獨顯示。目前活動會話是反白顯示為目前活動執行緒/堆疊幀的會話。若要將控制權切換到不同的會話,請聚焦該會話中的執行緒。
注意:這指的是作為現有會話的子級創建的會話,不要與[多個(父)調試會話][#multiple-debugging-sessions]混淆。
:VimspectorShowOutput <category>
。使用命令列完成來查看類別。如果輸出視窗關閉,可以使用:VimspectorShowOutput <category>
開啟一個新視窗(使用 tab-completion - wildmenu
檢視選項)。
控制台視窗是一個提示緩衝區(如果可用),並且可以用作偵錯適配器的互動式 CLI。對此的支援因適配器而異。
:VimspectorEval <expression>
。某些調試適配器可以完成此操作。<CR>
提交請求注意:另請參閱上面的手錶。
如果輸出視窗關閉,可以使用:VimspectorShowOutput Console
開啟一個新視窗。
控制台提示緩衝區將其omnifunc
設定為函數,該函數將計算目前命令/表達式的完成情況。這通常與<Ctrl-x><Ctrl-o>
一起使用(請參閱:help ins-completion
),或與您最喜歡的完成系統整合。緩衝區中的檔案類型設定為VimspectorPrompt
。
對於 YouCompleteMe,以下配置效果很好:
let g: ycm_semantic_triggers = {
' VimspectorPrompt ' : [ ' . ' , ' -> ' , ' : ' , ' < ' ]
}
Vimspector 日誌檔案包含 Vimspector 和偵錯適配器之間通訊的完整追蹤。當出現非 Vim 回溯的錯誤時,這是診斷資訊的主要來源。
如果您只想查看 Vimspector 日誌文件,請使用:VimspectorToggleLog
,它將在一個小視窗中追蹤該文件(在 Windows 上不起作用)。
您可以使用:VimspectorDebugInfo
查看一些調試信息
若要關閉偵錯器,請使用:
Reset
WinBar 按鈕:VimspectorReset
當 WinBar 不可用時。call vimspector#Reset()
如果停止或重設時偵錯物件仍在運行,則某些偵錯適配器可讓您指定完成偵錯時應發生的情況。通常,預設行為是明智的,這也是大多數時候發生的情況。根據 DAP,這些是預設值:
某些偵錯適配器可讓您選擇斷開連接時要執行的操作。如果您希望控制此行為,請使用:VimspectorReset
或呼叫vimspector#Reset( { 'interactive': v:true } )
。如果偵錯適配器提供是否終止偵錯物件的選擇,系統將提示您進行選擇。這同樣適用於vimspector#Stop()
它可以接受一個參數: vimspector#Stop( { 'interactive': v:true } )
。
注意:此功能是實驗性的,它的任何部分都可能會根據使用者回饋進行更改。
Vimspector 支援啟動任意數量的偵錯會話。每個會話都與一個單獨的 UI 選項卡相關聯。通常,您只會偵錯單個應用程序,因此不需要考慮這一點,但如果您需要同時偵錯多個獨立應用程式或應用程式的多個獨立實例,則此高級功能可能會很有用。
任何時候都有一個「活動」根會話。斷點與目前會話關聯,所有 UI 和 API 命令都套用於目前活動會話。
在根會話之間切換時,前一個會話的斷點標誌將被刪除,並顯示新啟動會話的斷點。雖然查看所有會話的斷點可能很有用,但這可能會非常令人困惑。
典型的工作流程可能是:
:edit server.cc
然後<F5>
)。這將啟動一個以所選配置命名的偵錯會話。您可以將其重新命名為:VimspectorRenameSession server
。:tabedit client.cc
)client
:: :VimspectorNewSession client
( client
現在是活動會話)。client
會話中新增斷點並使用<F5>
開始偵錯。您現在有 2 個 vimspector 選項卡。直觀上,切換到特定選項卡將使其會話處於活動狀態。您也可以使用:VimspectorSwitchToSession <name>
手動切換活動會話。
因此,總而言之,您擁有以下設施:
VimspectorNewSession <name>
這將建立一個新會話並使其處於活動狀態。啟動啟動時,使用可選名稱代替產生的名稱。VimspectorSwitchToSession <tab complete>
手動切換。VimspectorRenameSession <new name>
命名/重新命名會話VimspectorDestroySession <name>
手動銷毀它們(如果您勇敢的話)。您無法銷毀正在執行/活動的會話。vimspector#GetSessionName()
對於放入狀態列很有用。還有供技術人員使用的vimspector#GetSessionID()
。以下是如何在statusline
中顯示目前會話名稱的範例(請參閱:help statusline
或您的精美狀態列插件的文件)。
function ! StlVimspectorSession ()
" Only include in buffers containing actual files
if ! empty ( & buftype )
return ' '
endif
" Abort if vimspector not loaded
if ! exists ( ' *vimspector#GetSessionName ' ) ||
! exists ( ' *vimspector#GetSessionID ' )
return ' '
endif
return vimspector#GetSessionName ()
.. ' ( '
.. vimspector#GetSessionID ()
.. ' ) '
endfunction
" ... existing statusline stuff
" set statusline=...
" Show the vimspector active session name (max 20 chars) if there is onw.
set statusline += % ( % . 20 { StlVimspectorSession ()} % )
有關.vimspector.json
配置的介紹,請查看 Vimspector 網站的入門部分。
有關完整說明,包括如何使用變數、替換以及如何指定異常斷點,請參閱文件。
JSON 設定檔允許 C 風格的註解:
// comment to end of line ...
/* inline comment ... */
目前已使用以下調試適配器進行測試。
範例.vimspector.json
(適用於vscode-cpptools
和lldb-vscode
。對於lldb-vscode
將適配器的名稱替換為lldb-vscode
:
{
"configurations" : {
"Launch" : {
"adapter" : " vscode-cpptools " ,
"filetypes" : [ " cpp " , " c " , " objc " , " rust " ], // optional
"configuration" : {
"request" : " launch " ,
"program" : " <path to binary> " ,
"args" : [ ... ],
"cwd" : " <working directory> " ,
"environment" : [ ... ],
"externalConsole" : true ,
"MIMode" : " <lldb or gdb> "
}
},
"Attach" : {
"adapter" : " vscode-cpptools " ,
"filetypes" : [ " cpp " , " c " , " objc " , " rust " ], // optional
"configuration" : {
"request" : " attach " ,
"program" : " <path to binary> " ,
"MIMode" : " <lldb or gdb> "
}
}
// ...
}
}
WINDOWS 使用者註意:您需要安裝gdb.exe
。我建議使用scoop install gdb
。由於許可原因,Vimspector 無法使用 Visual Studio 偵錯器。
{
"configurations" : {
"Launch" : {
"adapter" : " vscode-cpptools " ,
"filetypes" : [ " cpp " , " c " , " objc " , " rust " ], // optional
"configuration" : {
"request" : " launch " ,
"program" : " <path to binary> " ,
"stopAtEntry" : true
}
}
}
}
根據後端,您需要手動啟用複雜類型的漂亮列印。
LLDB:預設啟用漂亮列印
GDB:要啟用 gdb 漂亮的印表機,請考慮下面的程式碼片段。在 .gdbinit 中set print pretty on
是不夠的!
{
"configurations" : {
"Launch" : {
"adapter" : " vscode-cpptools " ,
"filetypes" : [ " cpp " , " c " , " objc " , " rust " ], // optional
"configuration" : {
"request" : " launch " ,
"program" : " <path to binary> " ,
// ...
"MIMode" : " gdb " ,
"setupCommands" : [
{
"description" : " Enable pretty-printing for gdb " ,
"text" : " -enable-pretty-printing " ,
"ignoreFailures" : true
}
]
}
}
}
}
cpptools 文件描述如何使用miDebuggerAddress
將 cpptools 連接到 gdbserver。請注意,執行此操作時,您應該使用"request": "attach"
。
如果您有興趣,請查看參考指南,以了解讓 Vimspector 遠端啟動和附加的範例。
至少在 macOS 上,CodeLLDB 在許多方面都優於 vscode-cpptools。
參見鐵鏽。
另一種方法是使用 llvm 隨附的lldb-vscode
。方法如下:
brew install llvm
)/path/to/vimspector/gadgets/macos/.gadgets.d/lldb-vscode.json
的檔案: {
"adapters" : {
"lldb-vscode" : {
"variables" : {
"LLVM" : {
"shell" : " brew --prefix llvm "
}
},
"attach" : {
"pidProperty" : " pid " ,
"pidSelect" : " ask "
},
"command" : [
" ${LLVM}/bin/lldb-vscode "
],
"env" : {
"LLDB_LAUNCH_FLAG_LAUNCH_IN_TTY" : " YES "
},
"name" : " lldb "
}
}
}
任何基於 gdb/lldb 的偵錯器都支援 Rust。所以它與上面的vscode-cpptools
和lldb-vscode
配合得很好。然而, CodeLLDB
對 Rust 的支援最好。
./install_gadget.py --enable-rust
或:VimspectorInstall CodeLLDB
support/test/rust/vimspector_test
{
"configurations" : {
"launch" : {
"adapter" : " CodeLLDB " ,
"filetypes" : [ " rust " ],
"configuration" : {
"request" : " launch " ,
"program" : " ${workspaceRoot}/target/debug/vimspector_test "
}
},
"attach" : {
"adapter" : " CodeLLDB " ,
"filetypes" : [ " rust " , " c " , " cpp " , " jai " ],
"configuration" : {
"request" : " attach " ,
"program" : " ${workspaceRoot}/${fileBasenameNoExtension} " ,
"PID" : " ${PID} "
}
}
}
}
"request": "custom"
- 這是無效的。而是使用"request": "launch", "custom": true
。因為原因cargo
整合都是在 vscode javascript madness 中完成的,因此不支援。"request": custom
;請參閱上面關於“自訂”啟動的要點step-into
)可以透過新增"sourceMap": { "from_path" : "to_path" }
來完成。透過在堆疊追蹤中向上查找,可以在反彙編視窗中找到"from_path"
; "to_path"
只是目前工具鏈本機安裝的標準庫路徑。 Jai 調試可以與任何其他本機調試器一起正常工作。我推薦 CodeLLDB,但 cpptools 也可以。
例子:
{
"$schema" : "https://puremourning.github.io/vimspector/schema/vimspector.schema.json" ,
"adapters" : {
"gdb-with-build" : {
"extends" : "vscode-cpptools" ,
"variables" : {
"buildme" : {
"shell" : "jai ${workspaceRoot}/build.jai"
}
}
} ,
"codelldb-with-build" : {
"extends" : "CodeLLDB" ,
"variables" : {
"buildme" : {
"shell" : "jai ${workspaceRoot}/build.jai"
}
}
}
} ,
"configurations" : {
"Run - gdb" : {
"adapter" : "gdb-with-build" ,
"filetypes" : [ "jai" ] ,
"configuration" : {
"request" : "launch" ,
"program" : "${workspaceRoot}/${binaryName}" ,
"args" : [ "*${args}" ] ,
"stopAtEntry" : true ,
"stopOnEntry" : true
}
} ,
"Run - lldb" : {
"extends" : "Run - gdb" ,
"filetypes" : [ "jai" ] ,
"adapter" : "codelldb-with-build"
} ,
"Attach - gdb" : {
"adapter" : "vscode-cpptools" ,
"filetypes" : [ "jai" ] ,
"configuration" : {
"request" : "attach" ,
"program" : "${workspaceRoot}/${binaryName}" ,
"processId" : "${PID}"
}
} ,
"Attach - lldb" : {
"extends" : "Attach - gdb" ,
"filetypes" : [ "jai" ] ,
"adapter" : "CodeLLDB" ,
"configuration" : {
"pid" : "${PID}"
}
}
}
}
Python:偵錯
使用install_gadget.py --enable-python
或:VimspectorInstall debugpy
安裝,理想情況下需要一個工作編譯器和 python 開發頭檔/函式庫來建置 C python 擴充功能以提高效能。
注意:Debugpy debugpy-python2
支援 python 2 debugpy-python2
完整選項:https://github.com/microsoft/debugpy/wiki/Debug-configuration-settings
{
"configurations" : {
"<name>: Launch" : {
"adapter" : " debugpy " ,
"filetypes" : [ " python " ],
"configuration" : {
"name" : " <name>: Launch " ,
"type" : " python " ,
"request" : " launch " ,
"cwd" : " <working directory> " ,
"python" : " /path/to/python/interpreter/to/use " ,
"stopOnEntry" : true ,
"console" : " externalTerminal " ,
"debugOptions" : [],
"program" : " <path to main python file> "
}
}
...
}
}
為了使用 debugpy 進行遠端偵錯,您必須將 Vimspector 直接連接到正在偵錯的應用程式。這很簡單,但與我們通常的配置方式有點不同。具體來說,您需要:
--listen
參數。有關詳細信息,請參閱調試文件。{
"configurations" : {
"Python Attach" : {
"adapter" : " multi-session " ,
"filetypes" : [ " python " ], // optional
"configuration" : {
"request" : " attach " ,
"pathMappings" : [
// mappings here (optional)
]
}
}
}
}
請參閱啟動配置的詳細資訊以了解諸如pathMappings
之類的內容的說明。
debugpy 提供了其他文檔,包括當只能透過 SSH 聯繫遠端電腦時如何執行此操作。
如果您喜歡,請查看參考指南,以了解讓 Vimspector 遠端啟動和附加的範例。
為了繼續調試 python 2 應用程序,請確保安裝debugpy-python2
小工具(例如--force-enable-python2
或:VimspectorInstall debugpy-python2
),然後更改配置以使用:
{
"configurations" : {
"Python Attach" : {
"adapter" : " debugpy-python2 " ,
// ...
}
}
}
為了考試
請參閱我的 TclProDebug 分支以取得說明。
使用install_gadget.py --force-enable-csharp
或:VimspectorInstall netcoredbg
安裝
{
"configurations" : {
"launch - netcoredbg" : {
"adapter" : " netcoredbg " ,
"filetypes" : [ " cs " , " fsharp " , " vbnet " ], // optional
"configuration" : {
"request" : " launch " ,
"program" : " ${workspaceRoot}/bin/Debug/netcoreapp2.2/csharp.dll " ,
"args" : [],
"stopAtEntry" : true ,
"cwd" : " ${workspaceRoot} " ,
"env" : {}
}
}
}
}
要求:
install_gadget.py --enable-go
或:VimspectorInstall delve
go 1.16
或更高版本(早期版本為 YMMV)這使用了 delve 調試器內建的 DAP 支持
{
"configurations" : {
"run" : {
"adapter" : " delve " ,
"filetypes" : [ " go " ], // optional
"variables" : {
// example, to disable delve's go version check
// "dlvFlags": "--check-go-version=false"
},
"configuration" : {
"request" : " launch " ,
"program" : " ${fileDirname} " ,
"mode" : " debug "
}
}
}
}
使用變數配置以下內容:
dlvFlags
:(字串)傳遞給 delve 的附加命令列參數偵錯器 (delve) 在終端機視窗中啟動,以便您可以看到其輸出並將輸入傳遞給偵錯物件。
有關完整的啟動選項,請參閱 vscode-go 文件。是的,這似乎是它們唯一被記錄的地方(顯然,delve 本身沒有記錄它們)。
vscode-go 文件還提供有用的故障排除信息
要求:
install_gadget.py --enable-go
或:VimspectorInstall vscode-go
go get -u github.com/go-delve/delve/cmd/dlv
dlvToolPath
啟動選項注意:Vimspector 使用「舊版」vscode-go 偵錯適配器,而不是 Delve 中的「內建」DAP 支援。你可以追蹤#186。
{
"configurations" : {
"run" : {
"adapter" : " vscode-go " ,
"filetypes" : [ " go " ], // optional
"configuration" : {
"request" : " launch " ,
"program" : " ${fileDirname} " ,
"mode" : " debug " ,
"dlvToolPath" : " $HOME/go/bin/dlv "
// example, to disable delve's go version check
// "dlvFlags": [ "--check-go-version=false" ]
}
}
}
}
請參閱 vscode-go 文件以取得故障排除訊息
這使用 php-debug,請參閱 https://marketplace.visualstudio.com/items?itemName=felixfbecker.php-debug
要求:
install_gadget.py --force-enable-php
或:VimspectorInstall vscode-php-debug
zend_extension =xdebug.so
xdebug.remote_enable =on
xdebug.remote_handler =dbgp
xdebug.remote_host =localhost
xdebug.remote_port =9000
將localhost
替換為您工作站的 IP。
懶惰的選擇
zend_extension =xdebug.so
xdebug.remote_enable =on
xdebug.remote_handler =dbgp
xdebug.remote_connect_back =true
xdebug.remote_port =9000
{
"configurations" : {
"Listen for XDebug" : {
"adapter" : " vscode-php-debug " ,
"filetypes" : [ " php " ], // optional
"configuration" : {
"name" : " Listen for XDebug " ,
"type" : " php " ,
"request" : " launch " ,
"port" : 9000 ,
"stopOnEntry" : false ,
"pathMappings" : {
"/var/www/html" : " ${workspaceRoot} "
}
}
},
"Launch currently open script" : {
"adapter" : " vscode-php-debug " ,
"filetypes" : [ " php " ], // optional
"configuration" : {
"name" : " Launch currently open script " ,
"type" : " php " ,
"request" : " launch " ,
"program" : " ${file} " ,
"cwd" : " ${fileDirname} " ,
"port" : 9000
}
}
}
}
將XDEBUG_SESSION_START=xdebug
附加到您的查詢字串
curl "http://localhost?XDEBUG_SESSION_START=xdebug"
或使用前面提到的 Xdebug Helper 擴充功能(它設定XDEBUG_SESSION
cookie)
export XDEBUG_CONFIG= " idekey=xdebug "
php < path to script >
這使用了 vscode-js-debug,它也是 vscode 中使用的偵錯器。有關其他配置,請查看此處的文件。
若要安裝 vscode-js-debug,請從 vim 執行VimspectorInstall vscode-js-debug
或執行安裝腳本install_gadget.py --force-enable-node
。您可以查看多個範例。在support/test/node/simple
、 support/test/node/multiprocess
和support/test/node/typescript
下找到它們。調試打字稿的典型配置如下:
{
"configurations" : {
"run - js-debug" : {
"adapter" : " js-debug " ,
"filetypes" : [ " javascript " , " typescript " ],
"configuration" : {
"request" : " launch " ,
"program" : " ${workspaceRoot}/src/index.ts " ,
"cwd" : " ${workspaceRoot} " ,
"stopOnEntry" : false ,
"type" : " pwa-node "
},
// 'breakpoints' is an optional part. This is a way to configure exception
// breakpoints. You can leave this out or set as you prefer.
"breakpoints" : {
"exception" : {
"all" : " N " ,
"uncaught" : " N "
}
}
}
}
}
vscode-js-debug
支援許多不同的“類型”,並且可以執行一些可能有效或無效的操作。遺憾的是, type
欄位沒有記錄,但有效值在 DebugType 枚舉中定義。
Vimspector 僅針對pwa-node
類型進行了測試。
另請注意,由於某種原因,此偵錯適配器總是強制我們啟動多個偵錯會話。對於用戶來說,這不應該改變任何東西(除了可能有點令人困惑的堆疊追蹤)。但它確實使事情變得更加複雜,因此可能會出現微妙的錯誤。
這使用 chrome/firefox 偵錯器(它們非常相似),請參閱 https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome 和 https://marketplace.visualstudio.com/items?itemName分別為=firefox-devtools.vscode-firefox-debug。
它允許您從 Vim 中調試在 chrome 中運行的腳本。
./install_gadget.py --force-enable-chrome
或:VimspectorInstall debugger-for-chrome
./install_gadget.py --force-enable-firefox
或:VimspectorInstall debugger-for-firefox
support/test/web
{
"configurations" : {
"chrome" : {
"adapter" : " chrome " ,
"configuration" : {
"request" : " launch " ,
"url" : " http://localhost:1234/ " ,
"webRoot" : " ${workspaceRoot}/www "
}
},
"firefox" : {
"adapter" : " firefox " ,
"configuration" : {
"request" : " launch " ,
"url" : " http://localhost:1234/ " ,
"webRoot" : " ${workspaceRoot}/www " ,
"reAttach" : true
}
}
}
}
Vimspector 與 java 偵錯伺服器配合良好,它作為 jdt.ls(Java 語言伺服器)外掛程式運行,而不是獨立的偵錯適配器。
Vimspector 不負責運行語言伺服器,只負責偵錯適配器,因此這意味著您需要一個相容的語言伺服器協定編輯器外掛程式才能使用 Java。我推薦 YouCompleteMe,它完全支援 jdt.ls,最重要的是,它提供了載入偵錯適配器並將其與 Vimspector 一起使用的簡單方法。
使用java調試伺服器時,Vimspector支援熱代碼替換自訂功能。預設情況下,當底層類別檔案發生變更時,vimspector 會詢問使用者是否希望在執行時重新載入這些類別。
此行為可以自訂:
let g:vimspector_java_hotcodereplace_mode = 'ask'
- 預設值,每次重新載入時詢問使用者。let g:vimspector_java_hotcodereplace_mode = 'always'
- 不要問,總是重新載入let g:vimspector_java_hotcodereplace_mode = 'never'
- 不要詢問,從不重新載入install_gadget.py --force-enable-java <other options...>
或:VimspectorInstall java-debug-adapter
vscode-java
適配器為您的專案配置 Vimspector,例如: {
"configurations" : {
"Java Attach" : {
"adapter" : " vscode-java " ,
"filetypes" : [ " java " ],
"configuration" : {
"request" : " attach " ,
"hostName" : " ${host} " ,
"port" : " ${port} " ,
"sourcePaths" : [
" ${workspaceRoot}/src/main/java " ,
" ${workspaceRoot}/src/test/java "
]
}
}
}
}
gadgets/<os>
目錄,而不是任何特定的適配器。例如在.vimrc
中 " Tell YCM where to find the plugin. Add to any existing values.
let g: ycm_java_jdtls_extension_path = [
' </path/to/Vimspector/gadgets/<os> '
]
<leader><F5>
來啟動調試伺服器並啟動 vimspector,例如在~/.vim/ftplugin/java.vim
中: let s: jdt_ls_debugger_port = 0
function ! s: StartDebugging ()
if s: jdt_ls_debugger_port <= 0
" Get the DAP port
let s: jdt_ls_debugger_port = youcompleteme#GetCommandResponse (
' ExecuteCommand ' ,
' vscode.java.startDebugSession ' )
if s: jdt_ls_debugger_port == ' '
echom " Unable to get DAP port - is JDT.LS initialized? "
let s: jdt_ls_debugger_port = 0
return
endif
endif
" Start debugging with the DAP port
call vimspector#LaunchWithSettings ( { ' DAPPort ' : s: jdt_ls_debugger_port } )
endfunction
nnoremap <silent> <buffer> <Leader><F5> :call <SID> StartDebugging() <CR>
然後,您可以使用<Leader><F5>
開始調試,而不僅僅是<F5>
。
如果您看到“無法取得 DAP 連接埠 - JDT.LS 已初始化嗎?”,請嘗試執行:YcmCompleter ExecuteCommand vscode.java.startDebugSession
並記下輸出。如果您看到類似ResponseFailedException: Request failed: -32601: No delegateCommandHandler for vscode.java.startDebugSession
錯誤,請確保:
g:ycm_java_jdtls_extension_path
在.vimrc
中或在 YCM 啟動之前設定有關啟動參數,請參閱 vscode 文件。
有關更多背景信息,請參閱本期。
Lua 透過 local-lua-debugger-vscode 支援。該偵錯器使用 stdio 與正在運行的進程進行通信,因此調用io.read
會導致問題。
./install_gadget.py --enable-lua
或:VimspectorInstall local-lua-debugger-vscode
support/test/lua/simple
和support/test/lua/love
{
"$schema" : " https://puremourning.github.io/vimspector/schema/vimspector.schema.json# " ,
"configurations" : {
"lua" : {
"adapter" : " lua-local " ,
"filetypes" : [ " lua " ],
"configuration" : {
"request" : " launch " ,
"type" : " lua-local " ,
"cwd" : " ${workspaceFolder} " ,
"program" : {
"lua" : " lua " ,
"file" : " ${file} "
}
}
},
"luajit" : {
"adapter" : " lua-local " ,
"filetypes" : [ " lua " ],
"configuration" : {
"request" : " launch " ,
"type" : " lua-local " ,
"cwd" : " ${workspaceFolder} " ,
"program" : {
"lua" : " luajit " ,
"file" : " ${file} "
}
}
},
"love" : {
"adapter" : " lua-local " ,
"filetypes" : [ " love " ],
"configuration" : {
"request" : " launch " ,
"type" : " lua-local " ,
"cwd" : " ${workspaceFolder} " ,
"program" : {
"command" : " love "
},
"args" : [ " ${workspaceFolder} " ]
}
}
}
}
對 UI 客製化的支援非常有限。
Vimsector 在內部使用以下標誌。如果它們是在 Vimsector 使用之前定義的,則它們不會被替換。因此,要自訂標誌,請在vimrc
中定義它們。
符號 | 描述 | 優先事項 |
---|---|---|
vimspectorBP | 行斷點 | 9 |
vimspectorBPCond | 條件行斷點 | 9 |
vimspectorBPLog | 日誌點 | 9 |
vimspectorBPDisabled | 禁用斷點 | 9 |
vimspectorPC | 程式計數器(即目前行) | 200 |
vimspectorPCBP | 程式計數器和斷點 | 200 |
vimspectorNonActivePC | 非焦點線程的程式計數器 | 9 |
vimspectorCurrentThread | 堆疊追蹤視圖中的焦點線程 | 200 |
vimspectorCurrentFrame | 堆疊追蹤視圖中的目前堆疊幀 | 200 |
預設符號相當於以下內容:
sign define vimspectorBP text = ● texthl = WarningMsg
sign define vimspectorBPCond text = ◆ texthl = WarningMsg
sign define vimspectorBPLog text = ◆ texthl = SpellRare
sign define vimspectorBPDisabled text = ● texthl = LineNr
sign define vimspectorPC text = ▶ texthl = MatchParen linehl = CursorLine
sign define vimspectorPCBP text = ●▶ texthl = MatchParen linehl = CursorLine
sign define vimspectorNonActivePC linehl = DiffAdd
sign define vimspectorCurrentThread text = ▶ texthl = MatchParen linehl = CursorLine
sign define vimspectorCurrentFrame text = ▶ texthl = Special linehl = CursorLine
如果符號無法正確顯示,則您的字體可能不包含這些字形。您可以透過在 vimrc 中定義符號來輕鬆變更它們。例如,您可以將其放入vimrc
中使用一些簡單的 ASCII 符號:
sign define vimspectorBP text = o texthl = WarningMsg
sign define vimspectorBPCond text = o ? texthl = WarningMsg
sign define vimspectorBPLog text = !! texthl = SpellRare
sign define vimspectorBPDisabled text = o ! texthl = LineNr
sign define vimspectorPC text = > texthl = MatchParen
sign define vimspectorPCBP text = o > texthl = MatchParen
sign define vimspectorCurrentThread text = > texthl = MatchParen
sign define vimspectorCurrentFrame text = > texthl = Special
許多不同的插件提供用於各種目的的標誌。例如程式碼錯誤的診斷標誌等。如果您發現其他標誌幹擾 vimspector(反之亦然),您可以透過設定以下字典來自訂 vimspector 使用的優先順序:
let g: vimspector_sign_priority = {
' <sign-name> ' : <priority> ,
}
例如:
let g: vimspector_sign_priority = {
' vimspectorBP ' : 3 ,
' vimspectorBPCond ' : 3 ,
' vimspectorBPLog ' : 3 ,
' vimspectorBPDisabled ' : 3 ,
' vimspectorNonActivePC ' : 3 ,
' vimspectorPC ' : 999 ,
' vimspectorPCBP ' : 999 ,
}
所有鍵都是可選的。如果標誌未自訂,則使用預設優先權(如上所示)。
請參閱:help sign-priority
。預設優先級為 10,較大的數字優先於較小的數字。
注意:預設的vimspectorNonActivePC
符號不會向符號列添加任何文本,它只是添加行突出顯示,以便您可以看到其他線程或進程當前停止的行。因此,該符號通常應與添加符號的任何符號(例如斷點符號)合併。 Vim 只會合併具有相同優先權的標誌的屬性,因此如果變更預設優先權,建議:
vimspectorBP
、 vimspectorBPCond
等)具有相同的優先權。vimspectorNonActivePC
標誌相同的優先權vimspectorPC
、 vimspectorPCBP
等)具有較高的優先權。 注意:此自訂點目前無法使用,並且可能隨時變更。
有時,偵錯適配器會提供有關 UI 應如何顯示某些內容的提示。這包括堆疊幀、變數等。
Vimspector 提供了一種簡單的方法來自訂這些顯示方式,透過設定字典g:vimsepctor_presentation_hint_hl
中的值。
上述預設突出顯示組支援以下鍵。
團體 | 鑰匙 | 用法 | 預設 |
---|---|---|---|
全部 | normal | 以下未涵蓋的任何內容 | Normal |
堆疊追蹤 | emphasize | 強調堆疊追蹤中的來源 | Title |
堆疊追蹤 | deemphasize | 不強調堆疊追蹤中的來源 | Conceal |
堆疊追蹤 | label | 堆疊幀是“標籤”,不代表實際幀 | NonText |
堆疊追蹤 | subtle | 內部或不感興趣的堆疊幀 | Conceal |
範圍 | arguments | 函數參數範圍 | Title |
範圍 | locals | 局部變數作用域 | Title |
範圍 | registers | 暫存器範圍 | Title |
變數 | property | 函數參數範圍 | Identifier |
變數 | method | 局部變數作用域 | Function |
變數 | class | 暫存器範圍 | Type |
變數 | data | 暫存器範圍 | String |
此外,可以設定 DAP VariablePresentationHint
中提供的任何值,如果偵錯適配器提供該值,則將使用該值。
一個愚蠢的例子;對於大多數顏色方案來說,預設值應該是可以的:
let g: vimspector_presentation_hint_hl = {
' normal ' : ' Identifier ' ,
' label ' : ' Title ' ,
}
請注意:此自訂 API不穩定,這意味著它可能隨時更改。我將努力減少這一影響並宣布 Gitter 的變化。
以下選項控制 UI 視窗的預設大小(均為數字)
g:vimspector_sidebar_width
(預設值: 50 列): 左側實用程式視窗的列寬度 (變數、監視、堆疊追蹤)g:vimspector_bottombar_height
(預設 10 行):程式碼視窗下方的輸出視窗的高度(以行為單位)。例子:
let g: vimspector_sidebar_width = 75
let g: vimspector_bottombar_height = 15
終端通常被建立為程式碼視窗右側的垂直分割,並且該視窗被重新用於後續終端緩衝區。以下控制使用 Vim 內建終端機時用於偵錯程式輸入/輸出的終端視窗的大小。
g:vimspector_code_minwidth
(預設值: 82 列): 分割建立終端視窗時代碼視窗嘗試維護的最小列數。g:vimspector_terminal_maxwidth
(預設值: 80 列): 用於終端機的最大列數。g:vimspector_terminal_minwidth
(預設值: 10 列): 當終端無法容納g:vimspector_terminal_maxwidth
列時要使用的最小列數。有很多選項,但本質上我們嘗試確保主程式碼視窗至少有g:vimspector_code_minwidth
列,並且終端不會比g:vimspector_terminal_maxwidth
列寬。 g:vimspector_terminal_minwidth
是為了確保終端有合理的列數,即使沒有足夠的水平空間來滿足其他限制。
例子:
let g: vimspector_code_minwidth = 90
let g: vimspector_terminal_maxwidth = 75
let g: vimspector_terminal_minwidth = 20
僅在偵錯時定義映射並在偵錯完成後刪除這些映射非常有用。為此,Vimspector 提供了 2 個User
自動命令:
VimspectorJumpedToFrame
- 每當發生「中斷」事件或選擇要跳到的堆疊時觸發。這可用於為程式碼視窗中開啟的任何檔案建立(例如)緩衝區本機對應。VimspectorDebugEnded
- 當偵錯會話終止時觸發(實際上是當 Vimspector 完全重置時) support/custom_ui_vimrc
中包含使用此功能的範例方法。在那裡,這些自動命令用於為偵錯時訪問的任何檔案建立緩衝區本地映射,並在完成偵錯時清除它們。這對於像<Plug>VimspectorBalloonEval
這樣的命令特別有用,這些命令僅在偵錯時有意義(並且僅在程式碼視窗中)。檢查註釋部分Custom mappings while debugging
。
注意:這是一個相當進階的功能,需要一些重要的 vim 腳本。該功能將來可能會合併到 Vimspector 中,因為這是一個常見要求。
在許多情況下,您需要在開始新的偵錯工作階段之前重建專案。 Vimspector 不是任務管理器,實作此功能超出了本專案的範圍。然而,社群 wiki 中描述了一些實現類似功能的策略。
您可以透過設定告訴 vimspector 不要繪製 WinBar(程式碼、變數、輸出等視窗中的工具列):
let g: vimspector_enable_winbar = 0
如果未啟用滑鼠,則無論如何都不會顯示 WinBar。
請注意:此自訂 API不穩定,這意味著它可能隨時更改。我將努力減少這一影響並宣布 Gitter 的變化。
為了簡單起見,故意限制了上述視窗大小的客製化。 Vimspector 還為您提供了一種不受限制地自訂 UI 的方法,即在建立 UI 或開啟終端後執行User
自動命令。這需要您編寫一些 vim 腳本,但允許您執行以下操作:
您基本上可以透過編寫一些 vimscript 程式碼來完成您可以手動完成的任何事情。
User
自動命令是透過設定以下值的pattern
引發的:
VimspectorUICreated
:在為偵錯會話設定 UI 之後VimspectorTerminalOpened
:開啟程式輸入/輸出的終端機視窗後。設定以下全域變數來存取 UI 元素: g:vimspector_session_windows
。這是一個具有以下按鍵的dict
:
g:vimspector_session_windows.tabpage
: 會話的選項卡頁g:vimspector_session_windows.variables
:變數視窗的視窗 ID,包含vimspector.Variables
緩衝區。g:vimspector_session_windows.watches
:監視視窗的視窗 ID,包含vimspector.Watches
緩衝區。g:vimspector_session_windows.stack_trace
:包含vimspector.StackTrace
緩衝區的堆疊交易視窗的視窗 ID。g:vimspector_session_windows.code
: 程式碼視窗的視窗 ID。g:vimspector_session_windows.output
: 輸出視窗的視窗 ID。另外,在觸發VimspectorTerminalOpened
事件時加入以下按鍵:
g:vimspector_session_windows.terminal
: 終端機視窗的視窗 ID 您甚至可以透過簡單地執行常用的menu
(和unmenu
)命令來自訂 WinBar 按鈕。
預設情況下,Vimspector 使用類似這樣的東西:
nnoremenu WinBar.■ Stop : call vimspector#Stop ( { ' interactive ' : v: false } ) <CR>
nnoremenu WinBar.▶ Cont : call vimspector#Continue () <CR>
nnoremenu WinBar.▷ Pause : call vimspector#Pause () <CR>
nnoremenu WinBar.↷ Next : call vimspector#StepOver () <CR>
nnoremenu WinBar.→ Step : call vimspector#StepInto () <CR>
nnoremenu WinBar.← Out : call vimspector#StepOut () <CR>
nnoremenu WinBar.⟲: : call vimspector#Restart () <CR>
nnoremenu WinBar.✕ : call vimspector#Reset ( { ' interactive ' : v: false } ) <CR>
如果您喜歡不同的版面配置或 unicode 符號在您的字型中無法正確呈現,您可以在VimspectorUICreated
自動指令中進行自訂,例如:
func ! CustomiseUI ()
call win_gotoid ( g: vimspector_session_windows .code )
" Clear the existing WinBar created by Vimspector
nunmenu WinBar
" Create our own WinBar
nnoremenu WinBar.Kill : call vimspector#Stop ( { ' interactive ' : v: true } ) <CR>
nnoremenu WinBar. Continue : call vimspector#Continue () <CR>
nnoremenu WinBar.Pause : call vimspector#Pause () <CR>
nnoremenu WinBar. Step Over : call vimspector#StepOver () <CR>
nnoremenu WinBar. Step In : call vimspector#StepInto () <CR>
nnoremenu WinBar. Step Out : call vimspector#StepOut () <CR>
nnoremenu WinBar.Restart : call vimspector#Restart () <CR>
nnoremenu WinBar.Exit : call vimspector#Reset () <CR>
endfunction
augroup MyVimspectorUICustomistaion
autocmd !
autocmd User VimspectorUICreated call s: CustomiseUI ()
augroup END
support/custom_ui_vimrc
中有一些範例程式碼,展示如何使用視窗 ID 來使用一些基本的 vim 命令(主要是win_gotoid
函數和wincmd
ex 命令)修改 UI 的各個方面。
要試試看vim -Nu support/custom_ui_vimrc <some file>
。
這是一個較小的例子。使用它的一個簡單方法是將其放入~/.vim/plugin
中名為my_vimspector_ui.vim
的檔案中(或貼到vimrc
中):
" Set the basic sizes
let g: vimspector_sidebar_width = 80
let g: vimspector_code_minwidth = 85
let g: vimspector_terminal_minwidth = 75
function ! s: CustomiseUI ()
" Customise the basic UI...
" Close the output window
call win_gotoid ( g: vimspector_session_windows .output )
q
endfunction
function s: SetUpTerminal ()
" Customise the terminal window size/position
" For some reasons terminal buffers in Neovim have line numbers
call win_gotoid ( g: vimspector_session_windows . terminal )
set norelativenumber nonumber
endfunction
augroup MyVimspectorUICustomistaion
autocmd !
autocmd User VimspectorUICreated call s: CustomiseUI ()
autocmd User VimspectorTerminalOpened call s: SetUpTerminal ()
augroup END
.vimspector.json
中的內容並不一定很容易。正如您在上面所看到的,某些伺服器並不是真正與編輯器無關,並且需要非常具體的獨特處理。有關其他語言支援的詳細信息,請參閱 wiki.vimspector.json
中指定有關異常斷點的煩人問題的答案嗎?是的,看這裡。.vimspector.json
中指定要執行的文件,或者它可以是當前的 vim 文件嗎?你不需要。您可以為目前活動文件指定$file。請參閱此處以取得設定檔中替換的完整清單。.vimspector.json
中新增註釋,但 Vim 將這些註釋突出顯示為錯誤,您知道如何使其不是錯誤嗎?是的,把它放在~/.vim/after/syntax/json.vim
中: syn region jsonComment start = " / * " end = " * / "
hi link jsonCommentError Comment
hi link jsonComment Comment
gadget
和adapter
有什麼區別?小工具是您使用:VimspectorInstall
或install_gadget.py
安裝的東西, adapter
是 Vimspector 與之對話的東西(實際上它是描述該東西的 Vimspector 配置)。這些通常是一對一的,但理論上一個小工具可以提供多個adapter
配置。通常,當gadget
提供不同的adapter
配置(例如遠端偵錯或容器中的偵錯等)時,就會發生這種情況。.vimspector.json
放在每個項目的根目錄中?不,您可以使用g:vimspector_adapters
和g:vimspector_configurations
或將所有適配器和調試配置放在一個目錄中(如果您願意),但請注意在這種情況下${workspaceRoot}
將無法正確計算。 vimsepctor 作者經常使用這個vimspector#LaunchWithSettings( { 'ThePID': the_pid_i_picked } )
。或者,您可以使用shell
變數來猜測 PID,如下所示(運行pgrep vim | sort | tail -1
來獲取要調試的命令的“最高”PID(注意:這是為了調試 Vim。替換為適合您實際用例的內容(如果這對您來說沒有意義,您最好只輸入PID)。 "Attach: max PID" : {
"adapter" : " CodeLLDB " ,
"variables" : {
"pid" : {
"shell" : [
" /bin/bash " ,
" -c " ,
" pgrep vim | sort | tail -1 "
]
}
},
"configuration" : {
"request" : " attach " ,
"program" : " ${workspaceRoot}/src/vim " ,
"expressions" : " native " ,
"stopOnEntry#json" : " ${StopOnEntry:true} " ,
"pid" : " ${pid} "
}
},
範例g:vimspector_adapters
和g:vimspector_configurations
:
let g: vimspector_adapters = #{
test_debugpy: #{ extend s: ' debugpy ' }
}
let g: vimspector_configurations = {
" test_debugpy_config " : {
" adapter " : " test_debugpy " ,
" filetypes " : [ " python " ],
" configuration " : {
" request " : " launch " ,
" type " : " python " ,
" cwd " : " ${fileDirname} " ,
" args " : [],
" program " : " ${file} " ,
" stopOnEntry " : v: false ,
" console " : " integratedTerminal " ,
" integer " : 123 ,
},
" breakpoints " : {
" exception " : {
" raised " : " N " ,
" uncaught " : " " ,
" userUnhandled " : " "
}
}
} }