summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--.vim/lua/debugger.lua100
1 files changed, 100 insertions, 0 deletions
diff --git a/.vim/lua/debugger.lua b/.vim/lua/debugger.lua
new file mode 100644
index 0000000..d22c666
--- /dev/null
+++ b/.vim/lua/debugger.lua
@@ -0,0 +1,100 @@
+require('telescope').load_extension('dap')
+
+local dap = require('dap')
+dap.defaults.fallback.terminal_win_cmd = 'belowright 10new'
+
+-- 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', '<leader>dd', dap.toggle_breakpoint) -- convenience
+vim.keymap.set('n', '<leader>db', dap.toggle_breakpoint)
+vim.keymap.set('n', '<leader>dc', dap.continue)
+vim.keymap.set('n', '<leader>do', dap.step_over)
+vim.keymap.set('n', '<leader>di', dap.step_into)
+vim.keymap.set('n', '<leader>dO', dap.step_out)
+vim.keymap.set('n', '<leader>dR', dap.repl.toggle)
+vim.keymap.set('n', '<leader>dL', dap.run_last)
+vim.keymap.set('n', '<leader>dt', dap.terminate)
+
+local widgets = require('dap.ui.widgets')
+vim.keymap.set('n', '<leader>dh', widgets.hover)
+vim.keymap.set('n', '<leader>dB', require('telescope').extensions.dap.list_breakpoints)
+
+-- ADAPTERS
+
+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 ' .. code) 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.adapters.cppdbg = {
+  id = 'cppdbg',
+  type = 'executable',
+  command = vim.env.HOME .. '/.local/share/nvim/dap/ms-vscode.cpptools-1.9.1@linux-x64/extension/debugAdapters/bin/OpenDebugAD7',
+}
+
+-- CONFIGURATIONS
+
+dap.configurations.c = {
+  {
+    name = 'Launch binary',
+    type = 'cppdbg',
+    request = 'launch',
+    program = function()
+      -- TODO assuming meson
+      return vim.trim(vim.fn.system(
+        [[jq -r '..|select(.type?=="executable")|.filename|.[0]' ]] ..
+        vim.lsp.buf.list_workspace_folders()[1] ..
+        [[/build/meson-info/intro-targets.json]]
+      ))
+    end,
+    cwd = '${workspaceFolder}',
+    stopOnEntry = true,
+  },
+}
+
+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 = function()
+      local file
+      vim.ui.input('binary: ', function(result) file = result end)
+      return file
+    end,
+  },
+}