-- vim: fdm=marker local dap = require('dap') dap.defaults.fallback.terminal_win_cmd = 'belowright 10new' dap.defaults.fallback.focus_terminal = false -- open repl when session starts dap.listeners.after['event_initialized']['me'] = function() -- dap.repl.toggle() end -- try loading dap-launch.json -- require('dap.ext.vscode').load_launchjs(vim.fn.getcwd() .. '/dap-launch.json') -- 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', 'ds', 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', 'dq', 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_get_var, 'dap_bin') -- global let g:dap_bin if ok then local workspace_folders = vim.lsp.buf.list_workspace_folders() if #workspace_folders >= 1 then retval = retval:gsub(':workspace', workspace_folders[1]) end return retval end -- NOTE: try to resolve binaries from build system local bin = nil vim.ui.input({ prompt = 'DAP: binary to launch: ' }, function(choice) bin = choice end) if not bin == nil then return bin end return false 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.lldb = { type = 'executable', command = '/usr/bin/lldb-vscode', name = 'lldb', } 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 -- enable rust types dap.configurations.rust = vim.tbl_extend('force', dap.configurations.c, { initCommands = function() local rustc_sysroot = vim.fn.trim(vim.fn.system('rustc --print sysroot')) local script_import = 'command script import "' .. rustc_sysroot .. '/lib/rustlib/etc/lldb_lookup.py"' local commands_file = rustc_sysroot .. '/lib/rustlib/etc/lldb_commands' local commands = {} local file = io.open(commands_file, 'r') if file then for line in file:lines() do table.insert(commands, line) end file:close() end table.insert(commands, 1, script_import) return commands end, }) -- end of C/C++/Rust }}} local dapui = require('dapui') dapui.setup {} vim.keymap.set('n', 'du', dapui.toggle, { desc = 'toggle ui' })