有关教程和使用概述,请访问 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()
被调用)。在这两种情况下,文件/dir名称参数都是可选的。默认情况下,该文件被命名为.vimspector.session
,但是可以通过将g:vimspector_session_file_name
设置为其他内容,或者通过在调用命令时手动指定路径来通过全局更改。如果提供目录,则将默认或配置的会话文件名称读取或写入该目录。 Othewise,该文件是根据当前打开的缓冲区或写入当前工作目录的读取的。
高级用户可能希望通过添加VimEnter
和VimLeave
AutoCommands自动化加载和节省的过程。建议在这种情况下使用silent!
为了避免烦人的错误,如果无法读取或编写文件。
最简单的自动化形式是每当您使用会话文件启动VIM时加载Vimspector会话。这与这样做一样简单:
$ echo silent VimspectorLoadSession > Sessionx.vim
请参阅: *x.vim
文件的详细信息:help mksession
。您也可以使用SessionLoadPost
来执行类似的操作:
autocmd SessionLoadPost * silent ! VimspectorLoadSession
vimspector#StepInto()
等。也有vimspector#StepSOver()
和vimspector#StepIOver()
等,分别用于语句和指令粒度。 <CR>
,或双击左鼠标以展开/塌陷(+, - )。<C-CR>
(控制 + <CR>
)或< modifyOtherKeys
<leader><CR>
设置变量的值示波器和变量由缓冲区vimspector.Variables
表示。
如果您更喜欢用于变量和手表的更多详细显示,则可以let g:vimspector_variables_display_mode = 'full'
。默认情况下,仅显示名称和值的显示,其他数据可从悬停鼠标或触发<Plug>VimspectorBalloonEval
上的其他数据,其中包含变量(或手表)窗口中的值。
Variables and scopes
的所有规则都适用,加上以下内容:
a + b
)的视觉选择并获得其结果。nmap
)和视觉模式( xmap
)映射到<Plug>VimspectorBalloonEval
以手动触发弹出窗口。<C-CR>
(控制 + <CR>
)或< modifyOtherKeys
<leader><CR>
设置变量的值j
, k
)选择当前选择; <Esc>
(或离开工具提示窗口)以关闭工具提示。您可以通过设置g:vimspector_enable_auto_hover=0
禁用自动悬停弹出窗口,然后开始调试会话。然后,您可以将某些内容映射到<Plug>VimspectorBalloonEval
并手动触发它。
手表窗口用于检查变量和表达式。表达式在选定的堆栈框架中评估,该堆栈框架“聚焦”
手表窗口是一个及时的缓冲区,可以使用。输入插入模式以添加新的手表表达式。
<CR>
。:VimspectorWatch <expression>
。某些调试适配器中可以使用表达式的TAB-Completion。<CR>
扩展结果,或用左鼠标双击。<C-CR>
(控制 + <CR>
)或< modifyOtherKeys
<leader><CR>
设置变量的值<DEL>
删除。手表由buffer 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
)或与您喜欢的完成系统集成的。缓冲区中的Filetype设置为VimspectorPrompt
。
对于YouCompleteme,以下配置运行良好:
let g: ycm_semantic_triggers = {
' VimspectorPrompt ' : [ ' . ' , ' -> ' , ' : ' , ' < ' ]
}
:VimspectorDisassemble
, vimspector#ShowDisassembly()
或<Plug>VimspectorDisassemble
一些调试适配器(少数!)支持拆卸。在DAP中的工作方式有点奇怪,但实际上,Vimspector会要求在当前堆栈框架的PC周围拆卸许多说明。然后在带有类似于代码窗口的Winbar的窗口中显示了这一点,但具有指令步进粒度。当前指令有一个符号,以及“ ASM”的语法高视默认值,该默认值大多适合X86和ARM。
如上所述,当您的当前窗口是拆卸窗口时,您使用默认的“ step”命令(例如<F10>
)时,将自动将踏板划分为每个Instruction,而不是每个语句。
每次该过程停止时,Vimspector都会要求大约2个窗口,该窗口周围围绕当前PC。要查看更多信息,您可以滚动窗口。当窗口滚动到顶部或底部附近时,Vimspector将在额外的屏幕上分页。这不是完美的。有时,您必须滚动更多的内容才能将其放入(例如Ctrl-E Ctrl-Y)。这不是理想的,并且将来可能会得到改善。
您可以使用let g:vimspector_disassembly_height = 10
(或行数量)来控制拆卸窗口的Intial高度。
拆卸窗口中的缓冲区的Filetype(和语法)是vimspector-disassembly
。您可以使用FileType
自动仪表来自定义语法突出显示之类的内容。
注意:此功能是实验性的,并且可能会根据用户反馈以任何方式改变。
一些调试适配器提供了一种与变量关联的过程转储过程内存的方法。这可以从变量中完成,并用以下方式手表窗口。
<leader>m
映射(默认情况下,可以自定义)vimspector#ReadMemory()
函数在这样做时,要求您输入许多字节以读取(从与当前光标线相关的位置)和与该位置的偏移。在包含十六进制和ASCII中的内存转储的代码窗口中显示了一个新的缓冲区,类似于xxd
的输出。
注意:此功能是实验性的,并且可能会根据用户反馈以任何方式改变。
堆栈跟踪窗口显示每个程序线程的状态。可以扩展停止的线程以显示该线程的堆栈跟踪。
通常,但并非总是如此,当打断点击中时,所有线程都会停止。线程的状态显示在线程名称之后的括号中。在基础调试器的支持下,可以暂停线程并从堆栈跟踪窗口中单独延续。
CursorLine
高光组突出显示的特定线程是“焦点”线程。这是在代码窗口中接收诸如“步骤”,“逐步”,“继续”和“暂停”之类的命令的线程。可以手动将焦点线更改为“切换到”该线程。
<CR>
或双击左鼠标来扩展/折叠线程堆栈跟踪,或使用Winbar按钮。<CR>
,或双击左鼠标在堆栈框架上跳到它。vimspector#PauseContinueThread()
单独暂停或继续选择的线程。<leader><CR>
或vimspector#SetCurrentThread()
将“焦点”线程设置为当前选择的线程。如果所选行是堆栈框架,请将重点线程设置为该帧的线程,然后在代码窗口中跳到该框架。堆栈跟踪由buffer vimspector.StackTrace
表示。
如果有儿童调试会议,例如Debugee启动儿童流程的位置和Debug适配器支持多课程调试,那么每个会话的主题都会单独显示。当前活动的会话是当前活动的线程/堆栈框架突出显示的会话。要将控件切换到其他会话,请在该会话中集中线程。
注意:这是指作为现有会话的孩子创建的会话,不要与[多个(父母)调试会话混淆] [#多重张开课程]。
:VimspectorShowOutput <category>
。使用命令行完成以查看类别。如果关闭了输出窗口,则可以使用以下方式打开一个新的窗口:VimspectorShowOutput <category>
(使用Tab -Completion wildmenu
查看选项)。
控制台窗口是一个提示缓冲区,可用,可以用作调试适配器的交互式CLI。对此的支持在适配器之间有所不同。
:VimspectorEval <expression>
。一些调试适配器可以完成。<CR>
提交请求注意:另请参见上面的手表。
如果关闭输出窗口,则可以使用以下方式打开一个新的:VimspectorShowOutput Console
。
控制台提示缓冲区的omnifunc
设置为一个功能,该功能将计算当前命令/表达式的完成。这是与<Ctrl-x><Ctrl-o>
(请参阅:help ins-completion
)或与您喜欢的完成系统集成的。缓冲区中的Filetype设置为VimspectorPrompt
。
对于YouCompleteme,以下配置运行良好:
let g: ycm_semantic_triggers = {
' VimspectorPrompt ' : [ ' . ' , ' -> ' , ' : ' , ' < ' ]
}
Vimspector日志文件包含Vimspector和调试适配器之间的通信的完整踪迹。这是诊断信息的主要来源,当出现问题而不是VIM追溯。
如果您只想查看Vimspector日志文件,请使用:VimspectorToggleLog
,它将在一个小窗口中拖延(在Windows上不起作用)。
您可以看到一些调试信息:VimspectorDebugInfo
要关闭调试器,请使用:
Reset
Winbar按钮:VimspectorReset
当温鲍尔不可用时。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选项卡。直观地,WWITCH到特定选项卡将使其会话活动。您还可以使用以下方式手动切换活动会话: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远程启动和附加的示例。
CodellDB至少在MacOS上以多种方式优于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 "
}
}
}
RUST受到任何基于GDB/LLDB的调试器的支持。因此,它可以与上面的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疯狂中完成,因此不支持。"request": custom
;请参阅上面有关“自定义”启动的观点"sourceMap": { "from_path" : "to_path" }
来完成源映射(即,为标准库函数启用step-into
)。通过在堆栈跟踪中向上进行拆卸窗口中的"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:Debugpy
使用install_gadget.py --enable-python
或:VimspectorInstall debugpy
,理想情况下,需要一个工作的编译器和Python开发标头/libs来构建性能的C Python扩展。
注意:Debugpy不再支持Python 2。为了继续调试Python 2应用程序,请在安装debugpy-python2
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
参数。有关详细信息,请参见Debugpy文档。{
"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)是在终端窗口中启动的,因此您可以看到其输出并将输入传递到Debuggee。
有关完整的启动选项,请参见VSCODE-GO文档。是的,看来这是他们唯一记录的地方(显然,他们没有被挖掘出来)。
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
用工作站的IP替换localhost
。
懒惰的替代方案
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助手扩展程序(设置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 swind script install 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=mmsjsdiag.debugger-for-chrome and https://marksetplace.visualStudio.com/itemnemnams?itemname?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 Debug Server合作良好,该服务器以JDT.LS(Java Language Server)插件运行,而不是独立的调试适配器。
vimspector不在运行语言服务器的业务中,而是一次调试适配器,因此这意味着您需要兼容的语言服务器协议编辑器插件来使用Java。我建议您对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 | logpoint | 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
许多不同的插件为各种目的提供了标志。示例包括代码错误等的诊断标志。VIM仅提供一个优先级,以确定当将多个符号放置在一条线上时应显示哪个符号。如果您发现其他符号正在干扰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
中提供的任何值,如果调试适配器提供的话将使用。
一个愚蠢的例子;对于大多数颜色的scehemes,默认值可能是可以的:
let g: vimspector_presentation_hint_hl = {
' normal ' : ' Identifier ' ,
' label ' : ' Title ' ,
}
请注意:此自定义API不稳定,这意味着它可能随时更改。我将努力减少这种影响的影响,并宣布吉特的变化。
以下选项控制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
(default: 10 columns): Minimum number of columns to use when it is not possible to fit g:vimspector_terminal_maxwidth
columns for the terminal. That's a lot of options, but essentially we try to make sure that there are at least g:vimspector_code_minwidth
columns for the main code window and that the terminal is no wider than g:vimspector_terminal_maxwidth
columns. g:vimspector_terminal_minwidth
is there to ensure that there's a reasonable number of columns for the terminal even when there isn't enough horizontal space to satisfy the other constraints.
例子:
let g: vimspector_code_minwidth = 90
let g: vimspector_terminal_maxwidth = 75
let g: vimspector_terminal_minwidth = 20
It's useful to be able to define mappings only while debugging and remove those mappings when debugging is complete. For this purpose, Vimspector provides 2 User
autocommands:
VimspectorJumpedToFrame
- triggered whenever a 'break' event happens, or when selecting a stack from to jump to. This can be used to create (for example) buffer-local mappings for any files opened in the code window.VimspectorDebugEnded
- triggered when the debug session is terminated (actually when Vimspector is fully reset) An example way to use this is included in support/custom_ui_vimrc
. In there, these autocommands are used to create buffer-local mappings for any files visited while debugging and to clear them when completing debugging. This is particularly useful for commands like <Plug>VimspectorBalloonEval
which only make sense while debugging (and only in the code window). Check the commented section Custom mappings while debugging
.
NOTE: This is a fairly advanced feature requiring some nontrivial vimscript. It's possible that this feature will be incorporated into Vimspector in future as it is a common requirement.
In many cases you will want to rebuild your project before starting a new debugging session. Vimspector is not a task manager and implementing this functionality is out of the scope of this project. However, there are some strategies described in the community wiki to achieve similar functionality.
You can tell vimspector not to draw the WinBar (the toolbars in the code, variables, output, etc. windows) by setting:
let g: vimspector_enable_winbar = 0
The WinBar is in any case not displayed if the mouse is not enabled.
Please Note : This customisation API is unstable , meaning that it may change at any time. I will endeavour to reduce the impact of this and announce changes in Gitter.
The above customisation of window sizes is limited intentionally to keep things simple. Vimspector also provides a way for you to customise the UI without restrictions, by running a User
autocommand just after creating the UI or opening the terminal. This requires you to write some vimscript, but allows you to do things like:
You can essentially do anything you could do manually by writing a little vimscript code.
The User
autocommand is raised with pattern
set with the following values:
VimspectorUICreated
: Just after setting up the UI for a debug sessionVimspectorTerminalOpened
: Just after opening the terminal window for program input/output. The following global variable is set up for you to get access to the UI elements: g:vimspector_session_windows
. This is a dict
with the following keys:
g:vimspector_session_windows.tabpage
: The tab page for the sessiong:vimspector_session_windows.variables
: Window ID of the variables window, containing the vimspector.Variables
buffer.g:vimspector_session_windows.watches
: Window ID of the watches window, containing the vimspector.Watches
buffer.g:vimspector_session_windows.stack_trace
: Window ID of the stack trade window containing the vimspector.StackTrace
buffer.g:vimspector_session_windows.code
: Window ID of the code window.g:vimspector_session_windows.output
: Window ID of the output window. In addition, the following key is added when triggering the VimspectorTerminalOpened
event:
g:vimspector_session_windows.terminal
: Window ID of the terminal window You can even customise the WinBar buttons by simply running the usual menu
(and unmenu
) commands.
By default, Vimspector uses something a bit like this:
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>
If you prefer a different layout or if the unicode symbols don't render correctly in your font, you can customise this in the VimspectorUICreated
autocommand, for example:
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
There is some example code in support/custom_ui_vimrc
showing how you can use the window IDs to modify various aspects of the UI using some basic vim commands, primarily win_gotoid
function and the wincmd
ex command.
To try this out vim -Nu support/custom_ui_vimrc <some file>
.
Here's a rather smaller example. A simple way to use this is to drop it into a file named my_vimspector_ui.vim
in ~/.vim/plugin
(or paste into your 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
. As you can see above, some of the servers aren't really editor agnostic, and require very-specific unique handling. See the wiki for details on additional language support.vimspector.json
? Yes, see here..vimspector.json
, or could it be the current vim file?你不需要。 You can specify $file for the current active file. See here for complete list of replacements in the configuration file..vimspector.json
, but Vim highlights these as errors, do you know how to make this not-an-error? Yes, put this in ~/.vim/after/syntax/json.vim
: syn region jsonComment start = " / * " end = " * / "
hi link jsonCommentError Comment
hi link jsonComment Comment
gadget
and an adapter
? A gadget is something you install with :VimspectorInstall
or install_gadget.py
, an adapter
is something that Vimspector talks to (actually it's the Vimspector config describing that thing). These are usually one-to-one, but in theory a single gadget can supply multiple adapter
configs. Typically this happens when a gadget
supplies different adapter
config for, say remote debugging, or debugging in a container, etc..vimspector.json
in the root of every project? No, you can use g:vimspector_adapters
and g:vimspector_configurations
or put all of your adapter and debug configs in a single directory if you want to, but note the caveat that ${workspaceRoot}
won't be calculated correctly in that case. The vimsepctor author uses this a lotvimspector#LaunchWithSettings( { 'ThePID': the_pid_i_picked } )
. Alternatively, you could use a shell
variable to guess the PID, like this (which runs pgrep vim | sort | tail -1
to get the 'highest' PID of the command to be debugged (NOTE: this is for debugging Vim. replace with something appropriate to your actual use case. If this doesn't make sense to you, you might be better off just typing in the 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} "
}
},
Example g:vimspector_adapters
and 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 " : " "
}
}
} }