diff --git a/lazy-lock.json b/lazy-lock.json index 7b3766e..2459021 100644 --- a/lazy-lock.json +++ b/lazy-lock.json @@ -20,8 +20,13 @@ "mini.pairs": { "branch": "main", "commit": "b9aada8c0e59f2b938e98fbf4eae0799eba96ad9" }, "noice.nvim": { "branch": "main", "commit": "38c702be0d8fea81527ee6a73e1e834e72481193" }, "nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" }, + "nvim-dap": { "branch": "master", "commit": "6782b097af2417a4c3e33849b0a26ae2188bd7ea" }, + "nvim-dap-python": { "branch": "master", "commit": "64652d1ae1db80870d9aac7132d76e37acd86a26" }, + "nvim-dap-ui": { "branch": "master", "commit": "cf91d5e2d07c72903d052f5207511bf7ecdb7122" }, + "nvim-dap-virtual-text": { "branch": "master", "commit": "fbdb48c2ed45f4a8293d0d483f7730d24467ccb6" }, "nvim-lint": { "branch": "master", "commit": "9da1fb942dd0668d5182f9c8dee801b9c190e2bb" }, "nvim-lspconfig": { "branch": "master", "commit": "ac98db2f9f06a56498ec890a96928774eae412c3" }, + "nvim-nio": { "branch": "master", "commit": "21f5324bfac14e22ba26553caf69ec76ae8a7662" }, "nvim-treesitter": { "branch": "main", "commit": "4968877bb2dceac45948e24ee14298b1006b4cbf" }, "nvim-treesitter-textobjects": { "branch": "main", "commit": "1b2d85d3de6114c4bcea89ffb2cd1ce9e3a19931" }, "nvim-ts-autotag": { "branch": "main", "commit": "c4ca798ab95b316a768d51eaaaee48f64a4a46bc" }, diff --git a/lua/plugins/langs/python/debugger.lua b/lua/plugins/langs/python/debugger.lua new file mode 100644 index 0000000..ead5ae4 --- /dev/null +++ b/lua/plugins/langs/python/debugger.lua @@ -0,0 +1,104 @@ +-- lua/plugins/dap-python.lua +return { + -- Core DAP plugin + { + "mfussenegger/nvim-dap", + dependencies = { + -- UI for the debugger + { + "rcarriga/nvim-dap-ui", + dependencies = { "nvim-neotest/nvim-nio" }, + opts = {}, + config = function(_, opts) + local dap = require("dap") + local dapui = require("dapui") + dapui.setup(opts) + -- icons + + vim.fn.sign_define( + "DapBreakpoint", + { text = " 🔴", texthl = "DiagnosticError", linehl = "", numhl = "" } + ) + + -- Auto open/close UI + 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 + end, + }, + + -- Virtual text showing variable values + { + "theHamsta/nvim-dap-virtual-text", + opts = {}, + }, + + -- Python-specific adapter + { + "mfussenegger/nvim-dap-python", + config = function() + local dap = require("dap") + -- If installed via Mason: + require("dap-python").setup("~/.local/share/nvim/mason/packages/debugpy/venv/bin/python") + -- remote + table.insert(dap.configurations.python, { + type = "python", + request = "attach", + name = "Attach to Process (5678)", + connect = { + host = "localhost", + port = 5678, + }, + }) + end, + }, + }, + + keys = { + -- Basic debugging + -- stylua: ignore start + { "db", function() require("dap").toggle_breakpoint() end, desc = "Toggle Breakpoint" }, + { "dB", function() require("dap").set_breakpoint(vim.fn.input('Breakpoint condition: ')) end, desc = "Breakpoint Condition" }, + { "dc", function() require("dap").continue() end, desc = "Continue" }, + { "dC", function() require("dap").run_to_cursor() end, desc = "Run to Cursor" }, + { "dg", function() require("dap").goto_() end, desc = "Go to Line (No Execute)" }, + { "di", function() require("dap").step_into() end, desc = "Step Into" }, + { "dj", function() require("dap").down() end, desc = "Down" }, + { "dk", function() require("dap").up() end, desc = "Up" }, + { "dl", function() require("dap").run_last() end, desc = "Run Last" }, + { "do", function() require("dap").step_over() end, desc = "Step Over" }, + { "dO", function() require("dap").step_out() end, desc = "Step Out" }, + { "dp", function() require("dap").pause() end, desc = "Pause" }, + { "dr", function() require("dap").repl.toggle() end, desc = "Toggle REPL" }, + { "ds", function() require("dap").session() end, desc = "Session" }, + { "dt", function() require("dap").terminate() end, desc = "Terminate" }, + { "dw", function() require("dap.ui.widgets").hover() end, desc = "Widgets" }, + -- DAP UI + { "du", function() require("dapui").toggle({}) end, desc = "Dap UI" }, + { "de", function() require("dapui").eval() end, desc = "Eval", mode = {"n", "v"} }, + -- stylua: ignore end + { + "dI", + function() + local lines = { + "import debugpy", + 'debugpy.listen(("localhost", 5678))', + 'print("                              ")', + 'print(" Debugpy listening on port 5678 ", flush=True)', + 'print("                              ")', + "", + } + vim.api.nvim_buf_set_lines(0, 0, 0, false, lines) + end, + desc = "Insert debugpy listener at top", + ft = "python", + }, + }, + }, +}