Merge pull request #140 from puremourning/loading

Add a splash popup while starting up
This commit is contained in:
mergify[bot] 2020-03-26 23:31:13 +00:00 • committed by GitHub
commit 87e80db94d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 173 additions and 6 deletions

View file

@ -150,7 +150,7 @@ Alternatively, you can clone the repo and select which gadgets are installed:
Vimspector requires: Vimspector requires:
* Vim version 8.1 with at least patch 1264, or Neovim 0.4.3 * At least Vim version 8.2, or Neovim 0.4.3 (experimental)
* One of the following operating systems: * One of the following operating systems:
* Linux * Linux
* macOS Mojave or later * macOS Mojave or later
@ -162,6 +162,12 @@ Why such a new vim ? Well 2 reasons:
2. Because there are Vim bugs that vimspector triggers that will frustrate you 2. Because there are Vim bugs that vimspector triggers that will frustrate you
if you hit them. if you hit them.
Why is neovim experimental? Because the author doesn't use neovim regularly, and
there are no regression tests for vimspector in neovim, so it's likely to break
frequently. Issue reports are handled on best-efforts basis, and PRs are
welcome to fix bugs. See also the next section descibing differences for neovim
vs vim.
Why Windows support experimental? Because it's effort and it's not a priority Why Windows support experimental? Because it's effort and it's not a priority
for the author. PRs are welcome to fix bugs. Windows will not be regularly for the author. PRs are welcome to fix bugs. Windows will not be regularly
tested. tested.

View file

@ -0,0 +1,70 @@
" vimspector - A multi-language debugging system for Vim
" Copyright 2018 Ben Jackson
"
" Licensed under the Apache License, Version 2.0 (the "License");
" you may not use this file except in compliance with the License.
" You may obtain a copy of the License at
"
" http://www.apache.org/licenses/LICENSE-2.0
"
" Unless required by applicable law or agreed to in writing, software
" distributed under the License is distributed on an "AS IS" BASIS,
" WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
" See the License for the specific language governing permissions and
" limitations under the License.
" Boilerplate {{{
let s:save_cpo = &cpoptions
set cpoptions&vim
" }}}
" Neovim's float window API, like its job/channel API is painful to use
" compared to Vim's so we have to employ more hacks
" We can't seem to pass a Window handle back to the python, so we have to
" maintain yet another cached here
let s:db = {}
let s:next_id = 0
function! vimspector#internal#neopopup#DisplaySplash( message ) abort
let buf = nvim_create_buf(v:false, v:true)
call nvim_buf_set_lines(buf, 0, -1, v:true, [ a:message ] )
let l = len( a:message )
let opts = {
\ 'relative': 'editor',
\ 'width': l,
\ 'height': 1,
\ 'col': ( &columns / 2 ) - ( l / 2 ),
\ 'row': &lines / 2,
\ 'anchor': 'NW',
\ 'style': 'minimal',
\ 'focusable': v:false,
\ }
let win = nvim_open_win(buf, 0, opts)
call nvim_win_set_option(win, 'wrap', v:false)
let id = s:next_id
let s:next_id += 1
let s:db[ id ] = { 'win': win, 'buf': buf }
return id
endfunction
function! vimspector#internal#neopopup#UpdateSplash( id, message ) abort
let splash = s:db[ a:id ]
call nvim_buf_set_lines(splash.buf, 0, -1, v:true, [ a:message ] )
return a:id
endfunction
function! vimspector#internal#neopopup#HideSplash( id ) abort
let splash = s:db[ a:id ]
call nvim_win_close( splash.win, v:true )
unlet s:db[ a:id ]
endfunction
" Boilerplate {{{
let &cpoptions=s:save_cpo
unlet s:save_cpo
" }}}

View file

@ -0,0 +1,38 @@
" vimspector - A multi-language debugging system for Vim
" Copyright 2018 Ben Jackson
"
" Licensed under the Apache License, Version 2.0 (the "License");
" you may not use this file except in compliance with the License.
" You may obtain a copy of the License at
"
" http://www.apache.org/licenses/LICENSE-2.0
"
" Unless required by applicable law or agreed to in writing, software
" distributed under the License is distributed on an "AS IS" BASIS,
" WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
" See the License for the specific language governing permissions and
" limitations under the License.
" Boilerplate {{{
let s:save_cpo = &cpoptions
set cpoptions&vim
" }}}
function! vimspector#internal#popup#DisplaySplash( message ) abort
return popup_dialog( a:message, {} )
endfunction
function! vimspector#internal#popup#UpdateSplash( id, message ) abort
call popup_settext( a:id, a:message )
return a:id
endfunction
function! vimspector#internal#popup#HideSplash( id ) abort
call popup_hide( a:id )
endfunction
" Boilerplate {{{
let &cpoptions=s:save_cpo
unlet s:save_cpo
" }}}

View file

@ -19,7 +19,6 @@ import logging
import os import os
import shlex import shlex
import subprocess import subprocess
import traceback
import functools import functools
import vim import vim
@ -60,6 +59,7 @@ class DebugSession( object ):
self._variablesView = None self._variablesView = None
self._outputView = None self._outputView = None
self._breakpoints = breakpoints.ProjectBreakpoints() self._breakpoints = breakpoints.ProjectBreakpoints()
self._splash_screen = None
self._run_on_server_exit = None self._run_on_server_exit = None
@ -326,9 +326,12 @@ class DebugSession( object ):
def _Reset( self ): def _Reset( self ):
self._logger.info( "Debugging complete." ) self._logger.info( "Debugging complete." )
if self._uiTab: if self._uiTab:
self._logger.debug( "Clearing down UI with stack_trace: %s", self._logger.debug( "Clearing down UI" )
traceback.format_stack() )
vim.current.tabpage = self._uiTab vim.current.tabpage = self._uiTab
self._splash_screen = utils.HideSplash( self._api_prefix,
self._splash_screen )
self._stackTraceView.Reset() self._stackTraceView.Reset()
self._variablesView.Reset() self._variablesView.Reset()
self._outputView.Reset() self._outputView.Reset()
@ -436,6 +439,7 @@ class DebugSession( object ):
def GetOutputBuffers( self ): def GetOutputBuffers( self ):
return self._outputView.GetCategories() return self._outputView.GetCategories()
@IfConnected
def GetCompletionsSync( self, text_line, column_in_bytes ): def GetCompletionsSync( self, text_line, column_in_bytes ):
if not self._server_capabilities.get( 'supportsCompletionsRequest' ): if not self._server_capabilities.get( 'supportsCompletionsRequest' ):
return [] return []
@ -523,6 +527,11 @@ class DebugSession( object ):
return True return True
def _StartDebugAdapter( self ): def _StartDebugAdapter( self ):
self._splash_screen = utils.DisplaySplash(
self._api_prefix,
self._splash_screen,
"Starting debug adapter..." )
if self._connection: if self._connection:
utils.UserMessage( 'The connection is already created. Please try again', utils.UserMessage( 'The connection is already created. Please try again',
persist = True ) persist = True )
@ -560,6 +569,9 @@ class DebugSession( object ):
" g:_vimspector_adapter_spec " " g:_vimspector_adapter_spec "
")".format( self._connection_type ) ): ")".format( self._connection_type ) ):
self._logger.error( "Unable to start debug server" ) self._logger.error( "Unable to start debug server" )
self._splash_screen = utils.DisplaySplash( self._api_prefix,
self._splash_screen,
"Unable to start adapter" )
else: else:
self._connection = debug_adapter_connection.DebugAdapterConnection( self._connection = debug_adapter_connection.DebugAdapterConnection(
self, self,
@ -570,6 +582,11 @@ class DebugSession( object ):
self._logger.info( 'Debug Adapter Started' ) self._logger.info( 'Debug Adapter Started' )
def _StopDebugAdapter( self, callback = None ): def _StopDebugAdapter( self, callback = None ):
self._splash_screen = utils.DisplaySplash(
self._api_prefix,
self._splash_screen,
"Shutting down debug adapter..." )
def handler( *args ): def handler( *args ):
if callback: if callback:
self._logger.debug( "Setting server exit handler before disconnect" ) self._logger.debug( "Setting server exit handler before disconnect" )
@ -706,6 +723,11 @@ class DebugSession( object ):
return [ command ] return [ command ]
def _Initialise( self ): def _Initialise( self ):
self._splash_screen = utils.DisplaySplash(
self._api_prefix,
self._splash_screen,
"Initializing debug adapter..." )
# For a good explaination as to why this sequence is the way it is, see # For a good explaination as to why this sequence is the way it is, see
# https://github.com/microsoft/vscode/issues/4902#issuecomment-368583522 # https://github.com/microsoft/vscode/issues/4902#issuecomment-368583522
# #
@ -760,8 +782,18 @@ class DebugSession( object ):
launch_config.get( 'request', 'launch' ) ) launch_config.get( 'request', 'launch' ) )
if request == "attach": if request == "attach":
self._splash_screen = utils.DisplaySplash(
self._api_prefix,
self._splash_screen,
"Attaching to debugee..." )
self._PrepareAttach( adapter_config, launch_config ) self._PrepareAttach( adapter_config, launch_config )
elif request == "launch": elif request == "launch":
self._splash_screen = utils.DisplaySplash(
self._api_prefix,
self._splash_screen,
"Launching debugee..." )
# FIXME: This cmdLine hack is not fun. # FIXME: This cmdLine hack is not fun.
self._PrepareLaunch( self._configuration.get( 'remote-cmdLine', [] ), self._PrepareLaunch( self._configuration.get( 'remote-cmdLine', [] ),
adapter_config, adapter_config,
@ -807,6 +839,9 @@ class DebugSession( object ):
# leader rather than the process. The workaround is to manually SIGTRAP the # leader rather than the process. The workaround is to manually SIGTRAP the
# PID. # PID.
# #
self._splash_screen = utils.HideSplash( self._api_prefix,
self._splash_screen )
if self._launch_complete and self._init_complete: if self._launch_complete and self._init_complete:
for h in self._on_init_complete_handlers: for h in self._on_init_complete_handlers:
h() h()

View file

@ -546,3 +546,20 @@ def SetSyntax( current_syntax, syntax, *args ):
def GetBufferFiletypes( buf ): def GetBufferFiletypes( buf ):
ft = ToUnicode( vim.eval( f"getbufvar( {buf.number}, '&ft' )" ) ) ft = ToUnicode( vim.eval( f"getbufvar( {buf.number}, '&ft' )" ) )
return ft.split( '.' ) return ft.split( '.' )
def DisplaySplash( api_prefix, splash, text ):
if splash:
return Call( f'vimspector#internal#{api_prefix}popup#UpdateSplash',
splash,
text )
else:
return Call( f'vimspector#internal#{api_prefix}popup#DisplaySplash',
text )
def HideSplash( api_prefix, splash ):
if splash:
Call( f'vimspector#internal#{api_prefix}popup#HideSplash', splash )
return None

View file

@ -27,7 +27,7 @@ RUN ln -fs /usr/share/zoneinfo/Europe/London /etc/localtime && \
## cleanup of files from setup ## cleanup of files from setup
RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
ARG VIM_VERSION=v8.1.1270 ARG VIM_VERSION=v8.2.0460
ENV CONF_ARGS "--with-features=huge \ ENV CONF_ARGS "--with-features=huge \
--enable-python3interp \ --enable-python3interp \

View file

@ -10,7 +10,7 @@ function! Test_Step_With_Different_Tabpage()
lcd testdata/cpp/simple lcd testdata/cpp/simple
edit simple.cpp edit simple.cpp
" Add the breakpoing " Add the breakpoint
" TODO refactor FeedKeys " TODO refactor FeedKeys
15 15
call assert_equal( 15, line( '.' ) ) call assert_equal( 15, line( '.' ) )
@ -47,6 +47,7 @@ function! Test_Step_With_Different_Tabpage()
call vimspector#Reset() call vimspector#Reset()
call vimspector#ClearBreakpoints() call vimspector#ClearBreakpoints()
call WaitForAssert( {-> assert_notequal( vimspector_tabnr, tabpagenr() ) } )
lcd - lcd -
%bwipeout! %bwipeout!
endfunction endfunction