Use a prompt buffer for adding watches

This very new feature makes it kind of nice to add new watches in the
place where they will appear, keeping the eye in the same screen
location.
This commit is contained in:
Ben Jackson 2018-06-09 22:33:22 +01:00
commit 920db068c6
7 changed files with 54 additions and 9 deletions

6
.gitmodules vendored Normal file
View file

@ -0,0 +1,6 @@
[submodule "support/vscode-debugadapter-node"]
path = support/vscode-debugadapter-node
url = https://github.com/Microsoft/vscode-debugadapter-node
[submodule "support/python-jsonschema-objects"]
path = support/python-jsonschema-objects
url = https://github.com/cwacek/python-jsonschema-objects

View file

@ -83,6 +83,12 @@ function! vimspector#AddWatch( expr ) abort
py3 _vimspector_session.AddWatch( vim.eval( 'a:expr' ) )
endfunction
function! vimspector#AddWatchPrompt( expr ) abort
stopinsert
setlocal nomodified
call vimspector#AddWatch( a:expr )
endfunction
function! vimspector#ShowOutput( category ) abort
py3 _vimspector_session.ShowOutput( vim.eval( 'a:category' ) )
endfunction

View file

@ -48,7 +48,7 @@ class StackTraceView( object ):
self._currentThread = None
self._threads = []
with utils.ModifiableScratchBuffer( self._buf ):
self._buf[:] = None
utils.ClearBuffer( self._buf )
def ConnectionClosed( self ):
self.Clear()
@ -88,7 +88,7 @@ class StackTraceView( object ):
self._line_to_thread.clear()
with utils.ModifiableScratchBuffer( self._buf ):
self._buf[:] = None
utils.ClearBuffer( self._buf )
for thread in self._threads:
icon = '+' if '_frames' not in thread else '-'

View file

@ -52,9 +52,34 @@ def SetUpHiddenBuffer( buf, name ):
buf.options[ 'bufhidden' ] = 'hide'
buf.name = name
def SetUpPromptBuffer( buf, name, prompt, callback ):
# This feature is _super_ new, so only enable when available
if not int( vim.eval( "exists( '*prompt_setprompt' )" ) ):
return SetUpScratchBuffer( buf, name )
buf.options[ 'buftype' ] = 'prompt'
buf.options[ 'swapfile' ] = False
buf.options[ 'modifiable' ] = True
buf.options[ 'modified' ] = False
buf.options[ 'readonly' ] = False
buf.options[ 'buflisted' ] = False
buf.options[ 'bufhidden' ] = 'wipe'
buf.name = name
vim.eval( "prompt_setprompt( {0}, '{1}' )".format( buf.number,
Escape( prompt ) ) )
vim.eval( "prompt_setcallback( {0}, function( '{1}' ) )".format(
buf.number,
Escape( callback ) ) )
@contextlib.contextmanager
def ModifiableScratchBuffer( buf ):
if buf.options[ 'modifiable' ]:
yield
return
buf.options[ 'modifiable' ] = True
buf.options[ 'readonly' ] = False
try:
@ -189,3 +214,7 @@ def AppendToBuffer( buf, line_or_lines ):
# Return the first Vim line number (1-based) that we just set.
return line
def ClearBuffer( buf ):
buf[:] = None

View file

@ -60,7 +60,10 @@ class VariablesView( object ):
'nnoremap <buffer> <DEL> :call vimspector#DeleteWatch()<CR>' )
utils.SetUpScratchBuffer( self._vars.win.buffer, 'vimspector.Variables' )
utils.SetUpScratchBuffer( self._watch.win.buffer, 'vimspector.Watches' )
utils.SetUpPromptBuffer( self._watch.win.buffer,
'vimspector.Watches',
'Watch: ',
'vimspector#AddWatchPrompt' )
has_balloon = int( vim.eval( "has( 'balloon_eval' )" ) )
has_balloon_term = int( vim.eval( "has( 'balloon_eval_term' )" ) )
@ -85,9 +88,9 @@ class VariablesView( object ):
def Clear( self ):
with utils.ModifiableScratchBuffer( self._vars.win.buffer ):
self._vars.win.buffer[:] = None
utils.ClearBuffer( self._vars.win.buffer )
with utils.ModifiableScratchBuffer( self._watch.win.buffer ):
self._watch.win.buffer[:] = None
utils.ClearBuffer( self._watch.win.buffer )
def ConnectionClosed( self ):
self.Clear()
@ -251,7 +254,7 @@ class VariablesView( object ):
self._vars.lines.clear()
with utils.RestoreCursorPosition():
with utils.ModifiableScratchBuffer( self._vars.win.buffer ):
self._vars.win.buffer[:] = None
utils.ClearBuffer( self._vars.win.buffer )
for scope in self._scopes:
self._DrawScope( 0, scope )
@ -263,7 +266,7 @@ class VariablesView( object ):
self._watch.lines.clear()
with utils.RestoreCursorPosition():
with utils.ModifiableScratchBuffer( self._watch.win.buffer ):
self._watch.win.buffer[:] = None
utils.ClearBuffer( self._watch.win.buffer )
utils.AppendToBuffer( self._watch.win.buffer, 'Watches: ----' )
for watch in self._watches:
line = utils.AppendToBuffer( self._watch.win.buffer,
@ -297,8 +300,7 @@ class VariablesView( object ):
line = '{0}{1} Result: {2} '.format( ' ' * indent,
icon,
result[ 'result' ] )
line = utils.AppendToBuffer( self._watch.win.buffer,
line.split( '\n' ) )
line = utils.AppendToBuffer( self._watch.win.buffer, line.split( '\n' ) )
self._watch.lines[ line ] = result
if '_variables' in result:

@ -0,0 +1 @@
Subproject commit b5dad8a68c8287118a5fe09838cc1596720a3bb5

@ -0,0 +1 @@
Subproject commit e1b45efc60d2f58dff4cf5c8771b213fecc524e3