return { -- Add the nvim-dap related plugins { 'mfussenegger/nvim-dap', dependencies = { { 'rcarriga/nvim-dap-ui', opt = true, cmd = 'DapUI' }, { 'nvim-neotest/nvim-nio', opt = true, cmd = 'Neotest' }, { 'theHamsta/nvim-dap-virtual-text', opt = true, ft = { 'python', 'go', 'rust' } }, { 'mfussenegger/nvim-dap-python', opt = true, ft = 'python' }, { 'leoluz/nvim-dap-go', opt = true, ft = 'go' }, { 'simrat39/rust-tools.nvim', opt = true, ft = 'rust' }, 'williamboman/mason.nvim', -- Mason for managing external tools 'williamboman/mason-lspconfig.nvim' }, config = function() local dap = require('dap') local dapui = require('dapui') local dap_virtual_text = require('nvim-dap-virtual-text') local mason_registry = require('mason-registry') -- Initialize dap-ui dapui.setup() -- Initialize dap-virtual-text dap_virtual_text.setup() -- Keybindings vim.api.nvim_set_keymap('n', 'dc', ':lua require"dap".continue()', { noremap = true, silent = true }) vim.api.nvim_set_keymap('n', 'ds', ':lua require"dap".step_over()', { noremap = true, silent = true }) vim.api.nvim_set_keymap('n', 'di', ':lua require"dap".step_into()', { noremap = true, silent = true }) vim.api.nvim_set_keymap('n', 'do', ':lua require"dap".step_out()', { noremap = true, silent = true }) vim.api.nvim_set_keymap('n', 'db', ':lua require"dap".toggle_breakpoint()', { noremap = true, silent = true }) vim.api.nvim_set_keymap('n', 'dB', ':lua require"dap".set_breakpoint(vim.fn.input("Breakpoint condition: "))', { noremap = true, silent = true }) vim.api.nvim_set_keymap('n', 'dr', ':lua require"dap".repl.open()', { noremap = true, silent = true }) vim.api.nvim_set_keymap('n', 'du', ':lua require"dapui".toggle()', { noremap = true, silent = true }) -- DAP Python local function get_python_path() local cwd = vim.fn.getcwd() if vim.env.VIRTUAL_ENV then return vim.env.VIRTUAL_ENV .. '/bin/python' elseif vim.fn.executable(cwd .. '/venv/bin/python') == 1 then return cwd .. '/venv/bin/python' elseif vim.fn.executable(cwd .. '/.venv/bin/python') == 1 then return cwd .. '/.venv/bin/python' else return 'python' end end require('dap-python').setup(get_python_path()) -- DAP Go require('dap-go').setup() -- DAP Rust local rust_tools = require('rust-tools') -- Ensure codelldb is installed via Mason local codelldb_package = mason_registry.get_package('codelldb') local codelldb_path = codelldb_package:get_install_path() local codelldb_adapter = codelldb_path .. '/extension/adapter/codelldb' local codelldb_lib = codelldb_path .. '/extension/lldb/lib/liblldb.so' rust_tools.setup({ tools = { autoSetHints = true, inlay_hints = { show_parameter_hints = true, parameter_hints_prefix = "<- ", other_hints_prefix = "=> ", }, }, server = { on_attach = function(_, bufnr) -- DAP Rust keymaps vim.api.nvim_buf_set_keymap(bufnr, 'n', 'dr', ':RustDebuggables', { noremap = true, silent = true }) -- Keybind for RustHoverActions vim.api.nvim_buf_set_keymap(bufnr, 'n', 'K', ':RustHoverActions', { noremap = true, silent = true }) end, }, dap = { adapter = require('rust-tools.dap').get_codelldb_adapter( codelldb_adapter, codelldb_lib ), }, }) -- DAP UI integration dap.listeners.after.event_initialized["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 -- Define signs for breakpoints vim.fn.sign_define('DapBreakpoint', { text = '🔴', texthl = '', linehl = '', numhl = '' }) vim.fn.sign_define('DapStopped', { text = '🟢', texthl = '', linehl = '', numhl = '' }) end, keys = { { 'n', 'dc', ':lua require"dap".continue()' }, { 'n', 'ds', ':lua require"dap".step_over()' }, { 'n', 'di', ':lua require"dap".step_into()' }, { 'n', 'do', ':lua require"dap".step_out()' }, { 'n', 'db', ':lua require"dap".toggle_breakpoint()' }, { 'n', 'dB', ':lua require"dap".set_breakpoint(vim.fn.input("Breakpoint condition: "))' }, { 'n', 'dr', ':lua require"dap".repl.open()' }, { 'n', 'du', ':lua require"dapui".toggle()' } }, ft = { 'python', 'go', 'rust' } } }