從零開始配置vim(29)——DAP 配置

首先給大家說一聲抱歉,前段時間一直在忙換工作的事,包括但不限于交接、背面試題準備面試。好在最終找到了工作,也順利入職了。期間也有朋友在催更,在這里我對關注本系列的朋友表示感謝。多的就不說了,我們正式進入vim 的配置吧

上一節(jié)通過配置 python 的調(diào)試環(huán)境,我們大概了解了配置 dap 的基本步驟。首先需要一個 dap 的客戶端負責在編輯器上顯示各種調(diào)試信息,并且與用戶進行交互。然后需要一個服務端,與客戶端通信并完成調(diào)試的實際步驟。然后需要配置兩個東西, dap.adapters 用來配置如何啟動調(diào)試器,dap.configurations用來配置如何將當前項目加載到調(diào)試器上。

本篇我們進一步配置 dap。讓它變得更好用,并且介紹編譯型語言(C/C++)調(diào)試的配置。

優(yōu)化界面

回顧一下上一篇中在演示圖片里面看到的效果。默認界面在斷點位置以 B 來標識,當前運行的代碼以 -> 來標識??雌饋聿荒敲吹闹庇^,我們先對它進行優(yōu)化,我們采用 Visual Code 的調(diào)試圖標來進行標識

我們采用以下代碼進行配置

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)

上面的代碼主要配置了顯示的顏色和圖標。最終調(diào)試的效果如下圖所示


1.png

然后我們需要提供一個可用的界面用來顯示調(diào)試過程中的各種信息,包括變量值和調(diào)用棧。完成這個工作的是插件 nvim-dap-ui 。我們使用如下的代碼進行安裝

use { "rcarriga/nvim-dap-ui", requires = {"mfussenegger/nvim-dap"} }

這個插件里面包裝了很多調(diào)試相關的窗口,例如變量監(jiān)控、調(diào)用棧等等。我們可以對他進行配置,讓這些窗口元素出現(xiàn)在我們希望它出現(xiàn)的位置。為了加載這個插件我們還是按照之前的慣例,為它準備一個單獨的配置文件,并且加載它。

local dapui = require("dapui")
dapui.setup({})

我們可以使用該插件中的函數(shù) toggle() 開打開或者關閉這些調(diào)試窗口。最終的效果就像這樣

2.gif

每次都輸入這個函數(shù)來打開和關閉調(diào)試窗口比較麻煩,因此我們這里可以使用以下代碼來實現(xiàn)自動加載和關閉

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 的事件中注冊了幾個回調(diào)函數(shù),當對應的事件發(fā)生時會調(diào)用對應的函數(shù),我們在 dap 的調(diào)試啟動時打開調(diào)試窗口,在結束時關閉調(diào)試窗口

3.gif

最后關于界面方面的優(yōu)化再來推薦一個插件——nvim-dap-virtual-text 它的作用是在調(diào)試過程中,在變量附近事實顯示變量的值。我們可以在 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
})

上述的配置是官方給出的,我原封不動的復制過來了。它的效果如下圖所示:


4.gif

配置c++基礎調(diào)試環(huán)境

終于到了本文最重要的環(huán)節(jié)了,就是配置 c/c++ 的調(diào)試環(huán)境,上一篇我們講解了 Python 的配置,它代表了腳本類解釋型語言的調(diào)試配置,C/C++ 代表了編譯型語言的調(diào)試配置。

針對 C/C++ 的調(diào)試我們選用 cpptools 作為 dap 的服務端。首先通過 MasonInstall cpptools 來下載安裝它,也可以通過 :Mason 命令在圖形化的界面上進行安裝。

然后我們還是按照之前的順序來對他進行配置,首先配置它的加載方式

local dap = require("dap")

dap.adapters.cppdbg = {
    id = "cppdbg",
    type = 'executable',
    command = "~/.local/share/nvim/mason/bin/OpenDebugAD7",
}

這里我們設置它以 executable 的方式啟動(在客戶端調(diào)試時啟動)。然后指定可執(zhí)行程序的路徑,如果這里報找不到 OpenDebugAD7 這種錯誤,可以將 ~ 改為 /home/user 這樣的具體目錄。

然后我們配置一下客戶端與服務器通信相關的內(nèi)容

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.cppc++c使用同一個配置。因為 C/C++ 是編譯運行的,在調(diào)試的時候其實調(diào)試的是它生成的可執(zhí)行程序,所以這里每次在調(diào)試的時候需要手工指定要調(diào)試的可執(zhí)行程序。最后別忘了在 ftplugin/cpp.lua 中加載它

另外需要注意,因為可執(zhí)行程序運行時是不依賴源代碼的,但是調(diào)試的時候想讓調(diào)試器能夠準確的知道當前在源碼的位置并且能夠顯示當前變量的值,這個時候需要在可執(zhí)行程序中打包符號表,對于linuxC/C++ 程序來說,只需要在編譯的時候給gcc/g++ 傳遞 -s 參數(shù)即可。

我們寫一個簡單的 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;
}
5.gif

注意: 這里我們使用的調(diào)試器仍然是gdb, cpptools 只是在上層進行了一層封裝。因此這里能調(diào)試的前提是安裝了gdb 調(diào)試器

到此我們將關于 dap 調(diào)試的部分都基本介紹完了。其實 dap 也并沒有想象中那么難,目前從安裝到配置使用,都有大量的插件來方便我們使用,而且官網(wǎng)上基本都有配置的介紹,沒有特殊需求只需要將標準配置原樣拷貝粘貼即可。下一篇我們將補充一些關于 dap 的其他內(nèi)容,并介紹 neovim + gdb 的組合,敬請期待!

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容