-- vim: fdm=marker local dap = require('dap') dap.defaults.fallback.terminal_win_cmd = 'belowright 10new' dap.defaults.fallback.terminal_win_cmd = 'belowright 10new' -- open repl when session starts dap.listeners.after['event_initialized']['me'] = function() dap.repl.toggle() end -- 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', 'dd', dap.toggle_breakpoint, {desc='toggle breakpoint'}) -- convenience vim.keymap.set('n', 'db', dap.toggle_breakpoint, {desc='toggle breakpoint'}) vim.keymap.set('n', 'dc', dap.continue, {desc='continue'}) vim.keymap.set('n', 'do', dap.step_over, {desc='step over'}) vim.keymap.set('n', 'di', dap.step_into, {desc='step into'}) vim.keymap.set('n', 'dO', dap.step_out, {desc='step out'}) vim.keymap.set('n', 'dR', dap.repl.toggle, {desc='toggle REPL'}) vim.keymap.set('n', 'dL', dap.run_last, {desc='run last'}) vim.keymap.set('n', 'dt', dap.terminate, {desc='terminate'}) local widgets = require('dap.ui.widgets') vim.keymap.set('n', 'dh', widgets.hover, {desc='hover'}) vim.keymap.set('n', 'dB', require('telescope').extensions.dap.list_breakpoints, {desc='list breakpoints'}) -- Common local bin_from_var_or_pick = function() local ok, retval = pcall(vim.api.nvim_buf_get_var, 0, 'dap_bin') if ok then return retval end local bin = nil vim.ui.input({prompt = 'DAP Binary: '}, function(choice) bin = choice end) return bin end -- Go {{{ 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.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 = bin_from_var_or_pick, }, } -- end of Go }}} -- C/C++/Rust {{{ -- dap.adapters.cppdbg = { -- id = 'cppdbg', -- type = 'executable', -- command = vim.env.HOME .. '/.local/share/nvim/dap/ms-vscode.cpptools/extension/debugAdapters/bin/OpenDebugAD7', -- } dap.adapters.lldb = { type = 'executable', command = vim.trim(vim.fn.system('command -v lldb-vscode')), name = 'lldb', } -- 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.c = { { name = 'Launch', type = 'lldb', request = 'launch', program = bin_from_var_or_pick, args = {}, cwd = '${workspaceFolder}', stopOnEntry = false, }, { name = 'Attach', type = 'lldb', request = 'attach', pid = require('dap.utils').pick_process, args = {}, }, } dap.configurations.cpp = dap.configurations.c dap.configurations.rust = dap.configurations.c -- end of C/C++/Rust }}}