From 54510be14f9b4797646f1d3f0ed9e361eeea6cbf Mon Sep 17 00:00:00 2001 From: Joshua Potter Date: Thu, 23 Nov 2023 05:09:45 -0700 Subject: [PATCH] Allow specifying arguments to launch DAP. --- jrpotter/neovim/lua/init/dap.lua | 77 +++++++++++++++++++++++++++++--- 1 file changed, 72 insertions(+), 5 deletions(-) diff --git a/jrpotter/neovim/lua/init/dap.lua b/jrpotter/neovim/lua/init/dap.lua index cc1531b..9b8f5d1 100644 --- a/jrpotter/neovim/lua/init/dap.lua +++ b/jrpotter/neovim/lua/init/dap.lua @@ -1,13 +1,76 @@ local M = {} +local dap = require('dap') +local dap_ui = require('dap.ui') +local dap_ui_widgets = require('dap.ui.widgets') + +local function query_launch() + local command = vim.fn.input('Executable> ', vim.fn.getcwd() .. '/', 'file') + vim.api.nvim_echo({ { '', 'None' } }, false, {}) + + local parts = vim.split(command, '%s+', { trimempty = true }) + if not parts[1] then + vim.api.nvim_err_writeln('Invalid command specification.') + return + end + + return parts[1], {unpack(parts, 2, #parts)} +end + +-- Adaptation of https://github.com/mfussenegger/nvim-dap/blob/e154fdb6d70b3765d71f296e718b29d8b7026a63/lua/dap.lua#L413. +local function select_config_and_run() + local filetype = vim.api.nvim_buf_get_option(0, 'filetype') + local configs = dap.configurations[filetype] or {} + assert( + vim.tbl_islist(configs), + string.format( + '`dap.configurations.%s` must be a list of configurations, got %s', + filetype, + vim.inspect(configs) + ) + ) + if not configs[1] then + local msg = 'No configuration found for `%s`. You need to add configs ' .. + 'to `dap.configurations.%s` (See `:h dap-configuration`)' + vim.api.nvim_err_writeln(string.format(msg, filetype, filetype)) + return + end + + local opts = {} + opts.filetype = opts.filetype or filetype + + dap_ui.pick_if_many( + configs, + 'Configuration: ', + function(c) -- Label function + return c.name + end, + function(c) -- Callback + if not c then + vim.api.nvim_err_writeln('No configuration selected.') + return + end + local copy = vim.deepcopy(c) + if copy.request == 'launch' then + local program, args = query_launch() + copy.program = program + copy.args = args + end + dap.run(copy, opts) + end + ) +end + local function sidebar_new(widget) - return require('dap.ui.widgets').sidebar(widget, { width = 40 }, '') + return dap_ui_widgets.sidebar(widget, { width = 40 }, '') end local function sidebar_is_open(sidebar) return sidebar.win and vim.api.nvim_win_is_valid(sidebar.win) end +-- Setup buffer-local DAP mappings. This function is expected to be called in +-- a filetype plugin, e.g. `nvim/after/ftplugin/c.lua`. function M.buffer_map() local function set_nnoremap(key, func) vim.keymap.set( @@ -18,9 +81,6 @@ function M.buffer_map() ) end - local dap = require('dap') - local dap_ui_widgets = require('dap.ui.widgets') - local sidebars = { expression = sidebar_new(dap_ui_widgets.expression), frames = sidebar_new(dap_ui_widgets.frames), @@ -50,8 +110,15 @@ function M.buffer_map() end end - set_nnoremap('', dap.continue) + set_nnoremap('', select_config_and_run) set_nnoremap('b', dap.toggle_breakpoint) + set_nnoremap('c', function() + if dap.status() == '' then + vim.api.nvim_err_writeln('No active session.') + return + end + dap.continue() + end) set_nnoremap('d', dap.down) set_nnoremap('i', dap.step_into) set_nnoremap('n', dap.step_over)