1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
require('telescope').load_extension('dap')
local dap = require('dap')
dap.defaults.fallback.terminal_win_cmd = 'belowright 10new'
-- signs
vim.fn.sign_define({{name='DapBreakpoint', text='🞱', texthl='DapBreakpoint', linehl='DapBreakpointLn'}})
vim.fn.sign_define({{name='DapStopped', text='→', texthl='DapStopped', linehl='DapStoppedLn'}})
-- keymaps
vim.keymap.set('n', '<leader>dd', dap.toggle_breakpoint) -- convenience
vim.keymap.set('n', '<leader>db', dap.toggle_breakpoint)
vim.keymap.set('n', '<leader>dc', dap.continue)
vim.keymap.set('n', '<leader>do', dap.step_over)
vim.keymap.set('n', '<leader>di', dap.step_into)
vim.keymap.set('n', '<leader>dO', dap.step_out)
vim.keymap.set('n', '<leader>dR', dap.repl.toggle)
vim.keymap.set('n', '<leader>dL', dap.run_last)
vim.keymap.set('n', '<leader>dt', dap.terminate)
local widgets = require('dap.ui.widgets')
vim.keymap.set('n', '<leader>dh', widgets.hover)
vim.keymap.set('n', '<leader>dB', require('telescope').extensions.dap.list_breakpoints)
wk_register {
['<leader>d'] = {
name = '+Dap',
d = {'toggle_breakpoint'},
b = {'toggle_breakpoint'},
c = {'continue'},
o = {'step_over'},
i = {'step_into'},
O = {'step_out'},
R = {'repl'},
L = {'run_last'},
t = {'terminate'},
h = {'hover'},
B = {'list_breakpoints'}
}
}
-- ADAPTERS
dap.adapters.go_dlv_local = function(callback, config) -- {{{
local stdout = vim.loop.new_pipe()
local handle
local pid_or_err
local port = 38697
local opts = {
stdio = {nil, stdout},
args = {'dap', '-l', '127.0.0.1:' .. port},
detached = true,
}
handle, pid_or_err = vim.loop.spawn("dlv", opts, function(exit)
stdout:close()
handle:close()
if exit ~= 0 then vim.notify('dlv exited with exit code ' .. exit) end
end)
assert(handle, 'Error running dlv: ' .. tostring(pid_or_err))
stdout:read_start(function(err, chunk)
assert(not err, err)
if chunk then vim.schedule(function() require('dap.repl').append(chunk) end) end
end)
vim.defer_fn(function() callback({type = 'server', host = '127.0.0.1', port = port}) end, 100)
end -- }}}
dap.adapters.go_dlv_remote = {
type = 'server',
host = '127.0.0.1',
port = 38697,
}
dap.adapters.cppdbg = {
id = 'cppdbg',
type = 'executable',
command = vim.env.HOME .. '/.local/share/nvim/dap/ms-vscode.cpptools/extension/debugAdapters/bin/OpenDebugAD7',
}
-- CONFIGURATIONS
dap.configurations.c = {
{
name = 'Launch binary',
type = 'cppdbg',
request = 'launch',
program = function()
local file = vim.g.dapbin
if file then return file end
-- TODO: assuming meson
file = vim.trim(vim.fn.system(
[[jq -r '..|select(.type?=="executable")|.filename|.[0]' ]] ..
vim.lsp.buf.list_workspace_folders()[1] ..
[[/build/meson-info/intro-targets.json]]
))
local fd = vim.loop.fs_open(file, "r", 438)
if file and fd then
vim.loop.fs_close(fd)
return file
end
vim.ui.input('binary: ', function(result) file = result end)
return file
end,
cwd = '${workspaceFolder}',
stopOnEntry = true,
},
{
name = 'Attach to gdbserver',
type = 'cppdbg',
request = 'launch',
MIMode = 'gdb',
miDebuggerServerAddress = 'localhost:1234',
miDebuggerPath = '/usr/bin/gdb',
cwd = '${workspaceFolder}',
program = function()
local file = vim.g.dapbin
if file then return file end
vim.ui.input('binary: ', function(result) file = result end)
return file
end,
},
}
dap.configurations.cpp = dap.configurations.c
dap.configurations.go = {
{
name = 'Debug (local)',
type = 'go_dlv_local',
request = 'launch',
program = '${file}',
},
{
name = 'Debug (remote)',
type = 'go_dlv_remote',
request = 'launch',
mode = 'exec',
program = function()
local file = vim.g.dapbin
if file then return file end
vim.ui.input('binary: ', function(result) file = result end)
return file
end,
},
}
|