An extension for nvim-dap providing configurations for launching go debugger (delve) and debugging individual tests.
- Auto launch Delve. No configuration needed. You just have to have
dlv
in your path. - Run just the closest test from the cursor in debug mode (uses treesitter). See debugging individual tests section below for more details.
- Configuration to attach nvim-dap and Delve into a running process and start a debug session.
- Configuration to start a debug session in the main function.
- Configuration to run tests in a debug session.
- Configuration to run test in a debug session with custom arguments
This plugin extension make usage of treesitter to find the nearest test to debug.
Make sure you have the Go treesitter parser installed.
If using nvim-treesitter plugin you can install with :TSInstall go
.
- Install like any other neovim plugin:
- If using vim-plug:
Plug 'leoluz/nvim-dap-go'
- If using packer.nvim:
use 'leoluz/nvim-dap-go'
- If using vim-plug:
Call the setup function in your init.vim
to register the go adapter and the configurations to debug go tests:
lua require('dap-go').setup()
It is possible to customize nvim-dap-go by passing a config table in the setup function.
The example below shows all the possible configurations:
lua require('dap-go').setup {
-- Additional dap configurations can be added.
-- dap_configurations accepts a list of tables where each entry
-- represents a dap configuration. For more details do:
-- :help dap-configuration
dap_configurations = {
{
-- Must be "go" or it will be ignored by the plugin
type = "go",
name = "Attach remote",
mode = "remote",
request = "attach",
},
},
-- delve configurations
delve = {
-- the path to the executable dlv which will be used for debugging.
-- by default, this is the "dlv" executable on your PATH.
path = "dlv",
-- time to wait for delve to initialize the debug session.
-- default to 20 seconds
initialize_timeout_sec = 20,
-- a string that defines the port to start delve debugger.
-- default to string "${port}" which instructs nvim-dap
-- to start the process in a random available port
port = "${port}",
-- additional args to pass to dlv
args = {},
-- the build flags that are passed to delve.
-- defaults to empty string, but can be used to provide flags
-- such as "-tags=unit" to make sure the test suite is
-- compiled during debugging, for example.
-- passing build flags using args is ineffective, as those are
-- ignored by delve in dap mode.
build_flags = "",
},
}
- Call
:lua require('dap').continue()
to start debugging. - All pre-configured debuggers will be displayed for you to choose from.
- See
:help dap-mappings
and:help dap-api
.
To debug the closest method above the cursor use you can run:
:lua require('dap-go').debug_test()
Once a test was run, you can simply run it again from anywhere:
:lua require('dap-go').debug_last_test()
It is better to define a mapping to invoke this command. See the mapping section below.
- Select the option
Debug (Arguments)
- Enter each argument separated by a space (i.e.
option1 option2 option3
) - Press enter
- Register a new option to attach to a remote debugger:
lua require('dap-go').setup {
dap_configurations = {
{
type = "go",
name = "Attach remote",
mode = "remote",
request = "attach",
},
},
}
- Start
dlv
in headless mode. You can specify subcommands and flags after--
, e.g.,
dlv debug -l 127.0.0.1:38697 --headless ./main.go -- subcommand --myflag=xyz
- Call
:lua require('dap').continue()
to start debugging. - Select the new registered option
Attach remote
.
nmap <silent> <leader>td :lua require('dap-go').debug_test()<CR>
Thanks to the nvim-dap-python for the inspiration.