summary refs log tree commit diff
path: root/.vim/lua/debugger.lua
blob: d22c66634a42c91661e14c5071f8e03428398caa (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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,
  },
}