diff --git a/autoload/vimspector/internal/job.vim b/autoload/vimspector/internal/job.vim index 530acb3..dd76652 100644 --- a/autoload/vimspector/internal/job.vim +++ b/autoload/vimspector/internal/job.vim @@ -30,7 +30,7 @@ endfunction function! s:_OnExit( channel, status ) abort echom 'Channel exit with status ' . a:status redraw - unlet s:job + unlet s:job py3 _vimspector_session.OnServerExit( vim.eval( 'a:status' ) ) endfunction diff --git a/autoload/vimspector/internal/term.vim b/autoload/vimspector/internal/term.vim new file mode 100644 index 0000000..5a570fc --- /dev/null +++ b/autoload/vimspector/internal/term.vim @@ -0,0 +1,37 @@ +" 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#term#Start( cmd, opts ) abort + return term_start( a:cmd, a:opts ) +endfunction + +function! vimspector#internal#term#IsFinished( bufno ) abort + return index( split( term_getstatus( a:bufno ), ',' ), 'finished' ) >= 0 +endfunction + +function! vimspector#internal#term#GetPID( bufno ) abort + return job_info( term_getjob( a:bufno ) ).process +endfunction + +" Boilerplate {{{ +let &cpoptions=s:save_cpo +unlet s:save_cpo +" }}} diff --git a/python3/vimspector/code.py b/python3/vimspector/code.py index 509008d..6893b85 100644 --- a/python3/vimspector/code.py +++ b/python3/vimspector/code.py @@ -214,8 +214,8 @@ class CodeView( object ): if self._terminal_window is not None: assert self._terminal_buffer_number if ( self._terminal_window.buffer.number == self._terminal_buffer_number - and 'finished' in vim.eval( 'term_getstatus( {} )'.format( - self._terminal_buffer_number ) ) ): + and int( utils.Call( 'vimspector#internal#term#IsFinished', + self._terminal_buffer_number ) ) ): window_for_start = self._terminal_window options[ 'curwin' ] = 1 @@ -224,13 +224,9 @@ class CodeView( object ): with utils.TemporaryVimOptions( { 'splitright': True, 'equalalways': False } ): with utils.LetCurrentWindow( window_for_start ): - # TODO/FIXME: Do something about closing this when we reset ? - vim_cmd = 'term_start( {}, {} )'.format( json.dumps( args ), - json.dumps( options ) ) - - self._logger.debug( 'Start terminal: {}'.format( vim_cmd ) ) - - buffer_number = int( vim.eval( vim_cmd ) ) + buffer_number = int( utils.Call( 'vimspector#internal#term#Start', + args, + options ) ) terminal_window = vim.current.window if buffer_number is None or buffer_number <= 0: diff --git a/python3/vimspector/debug_session.py b/python3/vimspector/debug_session.py index edaf75c..fc85c85 100644 --- a/python3/vimspector/debug_session.py +++ b/python3/vimspector/debug_session.py @@ -798,8 +798,8 @@ class DebugSession( object ): buffer_number = self._codeView.LaunchTerminal( params ) response = { - 'processId': vim.eval( 'job_info( term_getjob( {} ) )' - '.process'.format( buffer_number ) ) + 'processId': int( utils.Call( 'vimspector#internal#term#GetPID', + buffer_number ) ) } self._connection.DoResponse( message, None, response ) diff --git a/python3/vimspector/utils.py b/python3/vimspector/utils.py index 79c8c67..850a759 100644 --- a/python3/vimspector/utils.py +++ b/python3/vimspector/utils.py @@ -455,11 +455,13 @@ def ToUnicode( b ): def Call( vimscript_function, *args ): call = vimscript_function + '(' for index, arg in enumerate( args ): + if index > 0: + call += ', ' + arg_name = 'vimspector_internal_arg_{}'.format( index ) vim.vars[ arg_name ] = arg call += 'g:' + arg_name - if index: - call += ',' call += ')' - vim.eval( call ) + _logger.debug( 'Calling: {}'.format( call ) ) + return vim.eval( call )