从零开始配置vim(28)——DAP 配置
首先给大家说一声抱歉,前段时间一直在忙换工作的事,包括但不限于交接、背面试题准备面试。好在最终找到了工作,也顺利入职了。期间也有朋友在催更,在这里我对关注本系列的朋友表示感谢。多的就不说了,我们正式进入vim
的配置吧
上一节通过配置 python
的调试环境,我们大概了解了配置 dap
的基本步骤。首先需要一个 dap
的客户端负责在编辑器上显示各种调试信息,并且与用户进行交互。然后需要一个服务端,与客户端通信并完成调试的实际步骤。然后需要配置两个东西, dap.adapters
用来配置如何启动调试器,dap.configurations
用来配置如何将当前项目加载到调试器上。
本篇我们进一步配置 dap
。让它变得更好用,并且介绍编译型语言(C/C++
)调试的配置。
优化界面
回顾一下上一篇中在演示图片里面看到的效果。默认界面在断点位置以 B
来标识,当前运行的代码以 ->
来标识。看起来不那么的直观,我们先对它进行优化,我们采用 Visual Code
的调试图标来进行标识
我们采用以下代码进行配置
local dap_breakpoint_color = {
breakpoint = {
ctermbg=0,
fg='#993939',
bg='#31353f',
},
logpoing = {
ctermbg=0,
fg='#61afef',
bg='#31353f',
},
stopped = {
ctermbg=0,
fg='#98c379',
bg='#31353f'
},
}
vim.api.nvim_set_hl(0, 'DapBreakpoint', dap_breakpoint_color.breakpoint)
vim.api.nvim_set_hl(0, 'DapLogPoint', dap_breakpoint_color.logpoing)
vim.api.nvim_set_hl(0, 'DapStopped', dap_breakpoint_color.stopped)
local dap_breakpoint = {
error = {
text = "",
texthl = "DapBreakpoint",
linehl = "DapBreakpoint",
numhl = "DapBreakpoint",
},
condition = {
text = 'ﳁ',
texthl = 'DapBreakpoint',
linehl = 'DapBreakpoint',
numhl = 'DapBreakpoint',
},
rejected = {
text = "",
texthl = "DapBreakpint",
linehl = "DapBreakpoint",
numhl = "DapBreakpoint",
},
logpoint = {
text = '',
texthl = 'DapLogPoint',
linehl = 'DapLogPoint',
numhl = 'DapLogPoint',
},
stopped = {
text = '',
texthl = 'DapStopped',
linehl = 'DapStopped',
numhl = 'DapStopped',
},
}
vim.fn.sign_define('DapBreakpoint', dap_breakpoint.error)
vim.fn.sign_define('DapBreakpointCondition', dap_breakpoint.condition)
vim.fn.sign_define('DapBreakpointRejected', dap_breakpoint.rejected)
vim.fn.sign_define('DapLogPoint', dap_breakpoint.logpoint)
vim.fn.sign_define('DapStopped', dap_breakpoint.stopped)
上面的代码主要配置了显示的颜色和图标。最终调试的效果如下图所示
然后我们需要提供一个可用的界面用来显示调试过程中的各种信息,包括变量值和调用栈。完成这个工作的是插件 nvim-dap-ui
。我们使用如下的代码进行安装
use { "rcarriga/nvim-dap-ui", requires = {"mfussenegger/nvim-dap"} }
这个插件里面包装了很多调试相关的窗口,例如变量监控、调用栈等等。我们可以对他进行配置,让这些窗口元素出现在我们希望它出现的位置。为了加载这个插件我们还是按照之前的惯例,为它准备一个单独的配置文件,并且加载它。
local dapui = require("dapui")
dapui.setup({})
我们可以使用该插件中的函数 toggle()
开打开或者关闭这些调试窗口。最终的效果就像这样
每次都输入这个函数来打开和关闭调试窗口比较麻烦,因此我们这里可以使用以下代码来实现自动加载和关闭
local dapui = require("dapui")
dapui.setup({})
local dap = require("dap")
dap.listeners.after.event_initialized["dapui_config"] = function()
dapui.open({})
end
dap.listeners.before.event_terminated["dapui_config"] = function()
dapui.close({})
end
dap.listeners.before.event_exited["dapui_config"] = function()
dapui.close({})
end
这段代码在 dap
的事件中注册了几个回调函数,当对应的事件发生时会调用对应的函数,我们在 dap
的调试启动时打开调试窗口,在结束时关闭调试窗口
最后关于界面方面的优化再来推荐一个插件——nvim-dap-virtual-text
它的作用是在调试过程中,在变量附近事实显示变量的值。我们可以在 dap-ui
的配置文件中对他进行配置
require("nvim-dap-virtual-text").setup({
enabled = true,
enable_commands = true,
highlight_changed_variables = true,
highlight_new_as_changed = false,
show_stop_reason = true,
commented = false,
only_first_definition = true,
all_references = false,
filter_references_pattern = '<module',
virt_text_pos = 'eol',
all_frames = false,
virt_lines = false,
virt_text_win_col = nil
})
上述的配置是官方给出的,我原封不动的复制过来了。它的效果如下图所示:
配置c++基础调试环境
终于到了本文最重要的环节了,就是配置 c/c++
的调试环境,上一篇我们讲解了 Python
的配置,它代表了脚本类解释型语言的调试配置,C/C++
代表了编译型语言的调试配置。
针对 C/C++
的调试我们选用 cpptools
作为 dap
的服务端。首先通过 MasonInstall cpptools
来下载安装它,也可以通过 :Mason
命令在图形化的界面上进行安装。
然后我们还是按照之前的顺序来对他进行配置,首先配置它的加载方式
local dap = require("dap")
dap.adapters.cppdbg = {
id = "cppdbg",
type = 'executable',
command = "~/.local/share/nvim/mason/bin/OpenDebugAD7",
}
这里我们设置它以 executable
的方式启动(在客户端调试时启动)。然后指定可执行程序的路径,如果这里报找不到 OpenDebugAD7
这种错误,可以将 ~
改为 /home/user
这样的具体目录。
然后我们配置一下客户端与服务器通信相关的内容
dap.configurations.cpp = {
{
name = "Launch file",
type = "cppdbg",
request = "launch",
program = function()
return vim.fn.input("Path to executable: ", vim.fn.getcwd() .. "/", "file")
end,
cwd = "${workspaceFolder}",
stopAtEntry = true,
},
}
dap.configurations.c = dap.configurations.cpp
最后我们通过一个 dap.configurations.c= dap.configurations.cpp
让c++
和 c
使用同一个配置。因为 C/C++
是编译运行的,在调试的时候其实调试的是它生成的可执行程序,所以这里每次在调试的时候需要手工指定要调试的可执行程序。最后别忘了在 ftplugin/cpp.lua
中加载它
另外需要注意,因为可执行程序运行时是不依赖源代码的,但是调试的时候想让调试器能够准确的知道当前在源码的位置并且能够显示当前变量的值,这个时候需要在可执行程序中打包符号表,对于linux
的 C/C++
程序来说,只需要在编译的时候给gcc/g++
传递 -s
参数即可。
我们写一个简单的 C程序来进行实验
#include <stdio.h>
int main (int argc, char *argv[])
{
printf("hello world\n");
for (size_t i = 0; i < 10; i++) {
printf("i = %ld\n", i);
}
return 0;
}
注意: 这里我们使用的调试器仍然是gdb, cpptools 只是在上层进行了一层封装。因此这里能调试的前提是安装了gdb 调试器
到此我们将关于 dap
调试的部分都基本介绍完了。其实 dap
也并没有想象中那么难,目前从安装到配置使用,都有大量的插件来方便我们使用,而且官网上基本都有配置的介绍,没有特殊需求只需要将标准配置原样拷贝粘贴即可。下一篇我们将补充一些关于 dap
的其他内容,并介绍 neovim + gdb
的组合,敬请期待!
从零开始配置vim(28)——DAP 配置的更多相关文章
- VIM懒人配置
VIM懒人配置 VIM配置起来,是很折腾人的.所以为了方便,直接使用前人的配置.重在用不在折腾. 1 VIM安装 一行命令. # sudo apt-get install vim 2 配置 vim的个 ...
- vim + ctags + taglist配置和使用
vim +ctags + taglist ,ctags+cscope 安装配置和使用 内容:VIM下ctags和taglist的安装配置方法:一键安装 ctags和cscope的方法 :vim语法高亮 ...
- Linux中vim的简单配置
本文主要分享Linux中vim的简单配置 ★配置文件的位置 在目录/etc.下面,有个名为vimrc的文件,这就是系统中公共的vim配置文件,对所有用户都开放.而在每个用户的主目录下,都可以自 ...
- Mac 配置 vim
Mac 配置 vim 安装 vim 7.4 cd ~ hg clone https://code.google.com/p/vim/ cd vim ./configure --with-feature ...
- mac配置vim-go
基本的设置信息(参考网址:http://hessian.cn/p/1026.html): "还是配置/.vimrc文件. syn on "语法支持 set laststatus=2 ...
- vim插件和配置
vim插件和配置 插件 pathogen 可以方便地管理vim插件 在没有pathogen的情况下,vim插件的文件全部都放在.vim目录,卸载插件很麻烦,pathogen可以将不同的插件放在一个单独 ...
- Mac 下升级 vim 并自己配置 vim 的过程
1.升级 vim 我自己 MacBook Pro 的系统还是 10.11 ,其自带的 vim 版本为 7.3 ,我们将其升至最新版: 使用 homebrew : brew install vim -- ...
- Centos7下安装和配置vim
Centos7 最新版本默认已经安装vim,可以使用命令查看是否安装 rpm -qa|grep vim 输出结果如下,如无以下输出结果,则安装vim: vim-filesystem-7.4.160-4 ...
- linux 配置vim(vimrc)
打开终端:ctrl+alt+t 进入vim文件:cd /etc/vim 打开vimrc文件:sudo gedit vimrc 然后在行末if语句前加上下面的内容," 这个符号为注释,后面内 ...
- Linux 配置vim编辑器
最终效果 步骤1.下载NERDTree插件安装包(vim目录插件) https://www.vim.org/scripts/script.php?script_id=1658 步骤2.在家目录创建 . ...
随机推荐
- Nginx The system cannot find the path specified
Nginx -t 时报 (3: The system cannot find the path specified) 原因:路径中有文件夹是中文,Nginx 全路径,不能包含中文
- 声明式调用 —— SpringCloud OpenFeign
Feign 简介 Spring Cloud Feign 是一个 HTTP 请求调用的轻量级框架,可以以 Java 接口注解的方式调用 HTTP 请求,而不用通过封装 HTTP 请求报文的方式直接调用 ...
- LeetCode | 983.最低票价(动态规划)
在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的日子将以一个名为days的数组给出.每一项是一个从 1 到 365 的整数. 火车票有三种不同的销售方式: 一张 ...
- 使用 Python 参与算法竞赛
引言 众所周知,打算法竞赛最频繁使用的语言是 C++.然而,对于那些不卡复杂度的题目,可以考虑使用 Python 编写(因为 Python 真的好写). 本文将简单地介绍一些 Python 使用技巧和 ...
- Codeforce Problem 711A - Bus to Udayland (正则表达式)
https://codeforces.com/problemset/problem/711/A 正则表达式基本应用 #include<bits/stdc++.h> using namesp ...
- 深度 | 新兴软件研发范式崛起,云计算全面走向 Serverless 化
11月3日,2022 杭州 · 云栖大会上,阿里云智能总裁张建锋表示,以云为核心的新型计算体系正在形成,软件研发范式正在发生新的变革,Serverless 是其中最重要的趋势之一,阿里云将坚定推进核心 ...
- 一文读懂 Serverless 的起源、发展和落地实践
讲师 | 洛浩(阿里云云原生高级架构师) Serverless 的发展轨迹 **2012 年,Serverless 这个单词第一次出现,由 Iron 公司提出,字面意思就是不需要服务器.但是真正被 ...
- 去重N皇后
题目:将上下对称.左右对称棋局.主副对角线对称棋局和旋转后重复视为重复,则要求输出去重后的N皇后问题的棋盘布局 这道题是一道作业题,我都惊到了,一向弱智的作业题中竟然冒出一道这样的题,这题最起码橙黄之 ...
- 第1篇 numpy 语法
import numpy as np A = np.array([ [1, 2, 3, 4], [5, 6, 7, 8], ], dtype=int) # dtype指定数据类型int float p ...
- Rocketmq学习3——消息发送原理源码浅析
一丶概述 RocketMQ 消息发送的原理流程可以分为以下几个步骤: 1. 创建生产者 在发送消息前,客户端首先需要创建一个消息生产者(Producer)实例,并设置必要的配置参数,如NameServ ...