{ config, pkgs, ... }: { home.packages = with pkgs; [ lldb_19 gdb rustc # python3.withPackages # (ps: with ps; [ debugpy ]) ]; programs.nixvim = { plugins = { dap-python = { enable = true; }; dap = { enable = true; luaConfig.post = '' local dap, dapui = require("dap"), require("dapui") 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 ''; adapters = { executables = { lldb = { command = "${pkgs.lldb_19}/bin/lldb-dap"; }; gdb = { command = "${pkgs.gdb}/bin/gdb"; args = [ "--interpreter=dap" "--eval-command" "set print pretty on" ]; }; rust-gdb = { command = "${pkgs.rustc}/bin/rust-gdb"; args = [ "--interpreter=dap" "--eval-command" "set print pretty on" ]; }; }; }; signs = { dapBreakpoint.text = ""; }; configurations = { cpp = [ { name = "Launch"; type = "gdb"; request = "launch"; program.__raw = # lua '' function() return vim.fn.input('Path to executable: ', vim.fn.getcwd() .. '/', 'file') end ''; cwd = "\${workspaceFolder}"; stopAtBeginningOfMainSubprogram = false; } { name = "Select and attach to process"; type = "gdb"; request = "attach"; program._raw = # lua '' function() return vim.fn.input('Path to executable: ', vim.fn.getcwd() .. '/', 'file') end ''; pid.__raw = '' function() local name = vim.fn.input('Executable name (filter): ') return require("dap.utils").pick_process({ filter = name }) end ''; cwd = "\${workspaceFolder}"; } { name = "Attach to gdbserver :1234"; type = "gdb"; request = "attach"; target = "localhost:1234"; program.__raw = '' function() return vim.fn.input('Path to executable: ', vim.fn.getcwd() .. '/', 'file') end ''; cwd = "\${workspaceFolder}"; } ]; c = [ { name = "Launch file"; type = "lldb"; request = "launch"; cwd = "\${workspaceFolder}"; stopOnEntry = false; program.__raw = # lua '' function() return coroutine.create(function(coro) local opts = {} require("telescope.pickers") .new(opts, { prompt_title = "Path to executable", finder = require("telescope.finders").new_oneshot_job({ "fd", "--hidden", "--no-ignore", "--type", "x" }, {}), sorter = require("telescope.config").values.generic_sorter(opts), attach_mappings = function(buffer_number) require("telescope.actions").select_default:replace(function() require("telescope.actions").close(buffer_number) coroutine.resume(coro, require("telescope.actions.state").get_selected_entry()[1]) end) return true end, }) :find() end) end ''; args = { }; } ]; rust = [ { name = "Launch"; type = "rust-gdb"; request = "launch"; program.__raw = '' function() return vim.fn.input('Path to executable: ', vim.fn.getcwd() .. '/', 'file') end ''; args = { }; cwd = "\${workspaceFolder}"; stopAtBeginningOfMainSubprogram = false; } { name = "Select and attach to process"; type = "rust-gdb"; request = "attach"; program.__raw = '' function() return vim.fn.input('Path to executable: ', vim.fn.getcwd() .. '/', 'file') end ''; pid.__raw = '' function() local name = vim.fn.input('Executable name (filter): ') return require("dap.utils").pick_process({ filter = name }) end ''; cwd = "\${workspaceFolder}"; } { name = "Attach to gdbserver :1234"; type = "rust-gdb"; request = "attach"; target = "localhost:1234"; program.__raw = '' function() return vim.fn.input('Path to executable: ', vim.fn.getcwd() .. '/', 'file') end ''; cwd = "\${workspaceFolder}"; } ]; }; }; dap-ui = { enable = true; }; dap-virtual-text = { enable = true; }; which-key.settings.spec = [ { __unkeyed-1 = "d"; group = "Debugger"; icon = " "; } ]; }; keymaps = [ { key = "dt"; action.__raw = "function() require('dap').toggle_breakpoint() end"; mode = [ "n" ]; options = { desc = "Toggle Breakpoint"; }; } { key = "dc"; action.__raw = "function() require('dap').continue() end"; mode = [ "n" ]; options = { desc = "Continue"; }; } { key = "dc"; action.__raw = "function() require('dap').continue() end"; mode = [ "n" ]; options = { desc = "Continue"; }; } { key = "di"; action.__raw = "function() require('dap').step_into() end"; mode = [ "n" ]; options = { desc = "Step Into"; }; } { key = "do"; action.__raw = "function() require('dap').step_over() end"; mode = [ "n" ]; options = { desc = "Step Over"; }; } { key = "du"; action.__raw = "function() require('dap').step_out() end"; mode = [ "n" ]; options = { desc = "Step Out"; }; } { key = "dr"; action.__raw = "function() require('dap').repl.open() end"; mode = [ "n" ]; options = { desc = "Open REPL"; }; } { key = "dl"; action.__raw = "function() require('dap').run_last() end"; mode = [ "n" ]; options = { desc = "Run Last"; }; } { key = "dq"; action.__raw = # lua '' function() require("dap").terminate() require("dapui").close() require("nvim-dap-virtual-text").toggle() end ''; mode = [ "n" ]; options = { desc = "Terminate"; }; } { key = "db"; action.__raw = "function() require('dap').list_breakpoints() end"; mode = [ "n" ]; options = { desc = "List Breakpoints"; }; } { key = "de"; action.__raw = "function() require('dap').set_exception_breakpoints({ ' all ' }) end"; mode = [ "n" ]; options = { desc = "Set Exception Breakpoints"; }; } ]; }; }