local dap, dapui = require('dap'), require('dapui') -- Open dapui once dap starts. dapui.setup() dap.listeners.before.attach.dapui_config = function() dapui.open() end dap.listeners.before.launch.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 -- Keybindings used in probably all editors/IDEs. vim.keymap.set('n', '', dap.continue) vim.keymap.set('n', '', dap.step_over) vim.keymap.set('n', '', dap.step_into) vim.keymap.set('n', '', dap.step_out) -- Breakpoints. vim.keymap.set('n', 'b', dap.toggle_breakpoint) vim.keymap.set('n', 'B', dap.set_breakpoint) vim.keymap.set('n', 'lp', function() dap.set_breakpoint(nil, nil, vim.fn.input('Log point message: ')) end) -- Repl, run and dap-ui bindings. vim.keymap.set('n', 'dr', dap.repl.open) vim.keymap.set('n', 'dl', dap.run_last) vim.keymap.set({'n', 'v'}, 'dh', function() require('dap.ui.widgets').hover() end) vim.keymap.set({'n', 'v'}, 'dp', function() require('dap.ui.widgets').preview() end) vim.keymap.set('n', 'df', function() local widgets = require('dap.ui.widgets') widgets.centered_float(widgets.frames) end) vim.keymap.set('n', 'ds', function() local widgets = require('dap.ui.widgets') widgets.centered_float(widgets.scopes) end) vim.fn.sign_define('DapBreakpoint', {text='󰬪', texthl='', linehl='', numhl=''}) -- Set up lldb (LLVM debugger) -- Install archlinux: sudo pacman -S lldb -- Install ubuntu: sudo apt dap.adapters.lldb = { type = 'server', port = "${port}", executable = { command = '/usr/bin/lldb-dap-18', args = { "--port", "${port}" }, }, } -- Custom debuggable build runs (on top of rust-analyzer debuggables). local ExecTypes = { TEST = "cargo build --tests -q --message-format=json", BIN = "cargo build -q --message-format=json" } local function runBuild(type) local lines = vim.fn.systemlist(type) local output = table.concat(lines, "\n") local filename = output:match('^.*"executable":"(.*)",.*\n.*,"success":true}$') if filename == nil then return error("failed to build cargo project") end return filename end -- Custom debuggable configurations. dap.configurations.rust = { { name = "Debug Test", type = "lldb", request = "launch", program = function () return runBuild(ExecTypes.TEST) end, cwd = "${workspaceFolder}", stopOnEntry = false, showDisassembly = "never" }, { name = "Debug Bin", type = "lldb", request = "launch", program = function () return runBuild(ExecTypes.BIN) end, cwd = "${workspaceFolder}", stopOnEntry = false, showDisassembly = "never" } }