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', 'dd', dap.toggle_breakpoint) -- convenience vim.keymap.set('n', 'db', dap.toggle_breakpoint) vim.keymap.set('n', 'dc', dap.continue) vim.keymap.set('n', 'do', dap.step_over) vim.keymap.set('n', 'di', dap.step_into) vim.keymap.set('n', 'dO', dap.step_out) vim.keymap.set('n', 'dR', dap.repl.toggle) vim.keymap.set('n', 'dL', dap.run_last) vim.keymap.set('n', 'dt', dap.terminate) local widgets = require('dap.ui.widgets') vim.keymap.set('n', 'dh', widgets.hover) vim.keymap.set('n', 'dB', require('telescope').extensions.dap.list_breakpoints) wk_register { ['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 ' .. code) 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-1.9.1@linux-x64/extension/debugAdapters/bin/OpenDebugAD7', } -- CONFIGURATIONS dap.configurations.c = { { name = 'Launch binary', type = 'cppdbg', request = 'launch', program = function() -- TODO assuming meson return 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]] )) end, cwd = '${workspaceFolder}', stopOnEntry = true, }, } 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.ui.input('binary: ', function(result) file = result end) return file end, }, }