summary refs log tree commit diff
path: root/.vim/lua/debugger.lua
blob: 32b75b5db10f333d75e05a7d64166d260ece31da (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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
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)

wk_register {
  ['<leader>d'] = {
    name = '+Dap',
    d = {'toggle_breakpoint'},
    b = {'toggle_breakpoint'},
    c = {'continue'},
    o = {'step_over'},
    i = {'step_into'},
    O = {'step_out'},
    R = {'repl'},
    L = {'run_last'},
    t = {'terminate'},
    h = {'hover'},
    B = {'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 ' .. exit) 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/extension/debugAdapters/bin/OpenDebugAD7',
}

-- CONFIGURATIONS

dap.configurations.c = {
  {
    name = 'Launch binary',
    type = 'cppdbg',
    request = 'launch',
    program = function()
      local file = vim.g.dapbin
      if file then return file end
      -- TODO: assuming meson
      file = 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]]
      ))
      local fd = vim.loop.fs_open(file, "r", 438)
      if file and fd then
        vim.loop.fs_close(fd)
        return file
      end
      vim.ui.input('binary: ', function(result) file = result end)
      return file
    end,
    cwd = '${workspaceFolder}',
    stopOnEntry = true,
  },
  {
    name = 'Attach to gdbserver',
    type = 'cppdbg',
    request = 'launch',
    MIMode = 'gdb',
    miDebuggerServerAddress = 'localhost:1234',
    miDebuggerPath = '/usr/bin/gdb',
    cwd = '${workspaceFolder}',
    program = function()
      local file = vim.g.dapbin
      if file then return file end
      vim.ui.input('binary: ', function(result) file = result end)
      return file
    end,
  },
}
dap.configurations.cpp = dap.configurations.c

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.g.dapbin
      if file then return file end
      vim.ui.input('binary: ', function(result) file = result end)
      return file
    end,
  },
}