diff --git a/lua/gopher/_utils/init.lua b/lua/gopher/_utils/init.lua index 6f41e22..4786fd4 100644 --- a/lua/gopher/_utils/init.lua +++ b/lua/gopher/_utils/init.lua @@ -53,4 +53,12 @@ return { vim.notify(msg, l) end, 0) end, + + ---safe require + ---@param name string module name + sreq = function(name) + local ok, m = pcall(require, name) + assert(ok, string.format("gopher.nvim dependency error: %s not installed", name)) + return m + end, } diff --git a/lua/gopher/dap/config.lua b/lua/gopher/dap/config.lua new file mode 100644 index 0000000..553f42d --- /dev/null +++ b/lua/gopher/dap/config.lua @@ -0,0 +1,98 @@ +local function get_arguments() + local co = coroutine.running() + if co then + return coroutine.create(function() + local args = {} + vim.ui.input({ prompt = "Args: " }, function(input) + args = vim.split(input or "", " ") + end) + coroutine.resume(co, args) + end) + else + local args = {} + vim.ui.input({ prompt = "Args: " }, function(input) + args = vim.split(input or "", " ") + end) + return args + end +end + +return { + adapter = function(callback, config) + local handle, pid_or_err + local stdout = vim.loop.new_pipe(false) + local host = config.host or "127.0.0.1" + local port = config.port or "38697" + local addr = string.format("%s:%s", host, port) + local opts = { + stdio = { nil, stdout }, + args = { "dap", "-l", addr }, + detached = true, + } + + handle, pid_or_err = vim.loop.spawn("dlv", opts, function(code) + stdout:close() + handle:close() + if code ~= 0 then + print("dlv exited with 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) + + -- Wait for delve to start + vim.defer_fn(function() + callback { type = "server", host = "127.0.0.1", port = port } + end, 100) + end, + configuration = { + { + type = "go", + name = "Debug", + request = "launch", + program = "${file}", + }, + { + type = "go", + name = "Debug (Arguments)", + request = "launch", + program = "${file}", + args = get_arguments, + }, + { + type = "go", + name = "Debug Package", + request = "launch", + program = "${fileDirname}", + }, + { + type = "go", + name = "Attach", + mode = "local", + request = "attach", + processId = require("dap.utils").pick_process, + }, + { + type = "go", + name = "Debug test", + request = "launch", + mode = "test", + program = "${file}", + }, + { + type = "go", + name = "Debug test (go.mod)", + request = "launch", + mode = "test", + program = "./${relativeFileDirname}", + }, + }, +} diff --git a/lua/gopher/dap/init.lua b/lua/gopher/dap/init.lua new file mode 100644 index 0000000..0c6ff7a --- /dev/null +++ b/lua/gopher/dap/init.lua @@ -0,0 +1,12 @@ +local cfg = require "gopher.dap.config" +local u = require "gopher._utils" +local M = {} + +---setup nvim-dap for golang using +function M.setup() + local dap = u.sreq "dap" + dap.adapters.go = cfg.adapter + dap.configurations.go = cfg.configuration +end + +return M