Ben Jackson wrote:
> When we were discussing vim9script, I mentioned that an interface for
> external/graphical debuggers for vimscript would be useful. Your response
> at the time was:
>
> > > >> * provide a interface to a debug adapter to allow debugging of
> vimscript
> > > >> executing in a Vim instance (i.e. Vim Debug Adapter)
> > > >
> > > > Sure.
> >
> > > Woo \o/. Debugging vimscript with vimspector would be very kickass.
> > > I’m more than willing to put in hard graft to make this happen.
>
> > It's not really related to Vim9 script, could be an independend project.
>
> So, challenge accepted. Over the last few months I've been working on this
> and have a mostly working prototype. I have even recently used it to debug
> a real problem in a real vim plugin.
>
> Here's a
> demo:
https://files.gitter.im/vimspector/Lobby/qnjv/vimspector-vimscript-demo.gif
Looks very interesting!
> What you can see in the demo:
>
> - I open a .vim file, set a breakpoint and launch vim in a terminal window
> (using vimsector)
> - Vim (in the terminal window) hits the breakpoint and vimspector jumps to
> the current line in my code
> - Using vimspector I can step throught the vimscript, inspect local,
> script, window, etc. variables and view the _full_ execution stack
> (including source's etc.)
Do I get it right that vimspector is a Vim plugin?
> Very briefly, the way this works is the vim-under-debug delegates the debug
> command loop (in debug.c) to a vimscript function, implemented by my
> "vim-debug-adapter" plugin. This callback's job is to provide a single
> command to execute (such as "next" or "step" or an ex command, like 'break
> add'). It does this by having a channel, connected to a debug adapter in a
> "request one command" loop. Meanwhile the debug adapter can issue other
> requests, implemented in the channel's callback.
That sounds like a nice mechanism. So it's mostly the same as the
existing debug code, but instead of prompting the user in the
Vim-under-debug itself the prompt goes over the channel.
I haven't dug into this, but I assume the output of a command also goes
over the channel, thus the Vim-under-debug doesn't show any debug
output.
This can be improved. Instead of hard coding the function name it could
be specified with a command:
:debugfunc MyDebugger
:debugfunc NONE
> - completing the implementation of estack to hold data for sourced files,
> ufuncs, auto commands, etc. - this allows a new function (debug_getstack)
> to get the full stack trace shown in the demo. Normally stack traces only
> include the latest run of ufunc calls.
This can most likely be a separate change. I was working towards this
with the "exestack" stuff. Which was far from complete. Should also be
used for error messages and exceptions.
> - adding some vimscript commands like `debug_getvariables( scope )`,
> `debug_eval( in_scope, expr )`, debug_getstack
> (
https://github.com/puremourning/vim/blob/debugger/src/evalfunc.c#L58-L60)
> - adding a way to evaluate a command in a script context (as well as a
> function context) that isn't the top of the stack (essentially use the
> _full_ execution stack for debug_backtrace_level)
This sounds similar to something as the "frame" command in gdb, to
change the debugger scope.
> - changes to breakpoints so that you can set a file-line breakpoint
> _within_ a function such that it fires when the function executes, rather
> than only when it is defined (this is quite hairy at the moment)
> - probably a bunch of equivalent changes for vim9 (haven't tried this yet)
>
> The very-work-in-progress vim changes are here
> :
https://github.com/puremourning/vim/compare/master...puremourning:debugger
> The runtime code that provides the interface to DAP is
> here:
https://github.com/puremourning/vim-debug-adapter/blob/master/runtime/nub.vim
> (and the debug adapter
> itself:
https://github.com/puremourning/vim-debug-adapter)
>
> So the purpose of this RFC is to see whether I should progress further down
> this route:
>
> - share the demo/prototype for visibility
> - get your appetite for merging a patch like this (I would push the changes
> in smaller tested pieces of course)
> - get your general thoughts on the approach above
> - gauge community reaction, thoughts, comments, insults etc.
>
> Thanks for everything. If the general reaction is positive, I'll make a
> proper plan and send some more detailed RFCs for the various aspects.
I won't have much time to dig into the inners of this, but generally it
sounds like a good way to go. The target audience will be plugin
writers, thus I would suggest to first get some feedback from them.
That probably requires making many things work, but it appears you
already have that.
How about writing a "Intro in Vim debugging" that plugin writers can
follow, a hands-on kind of training.
The implementation details can still change, I think it's important to
first check the boundaries of what can be done with the current
mechanism, what is needed for the debugging.
--
SECOND SOLDIER: It could be carried by an African swallow!
FIRST SOLDIER: Oh yes! An African swallow maybe ... but not a European
swallow. that's my point.
"Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
/// Bram Moolenaar -- Br...@Moolenaar.net --
http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features --
http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language --
http://www.Zimbu.org ///
\\\ help me help AIDS victims --
http://ICCF-Holland.org ///