From 04bb03da0ab1ee0486cd1ac60df900f33ef2c131 Mon Sep 17 00:00:00 2001 From: Ben Jackson Date: Wed, 8 Jan 2020 21:06:57 +0000 Subject: [PATCH] Add channel support for neovim --- autoload/vimspector/internal/channel.vim | 5 -- autoload/vimspector/internal/neochannel.vim | 85 +++++++++++++++++++++ autoload/vimspector/internal/neojob.vim | 2 +- 3 files changed, 86 insertions(+), 6 deletions(-) create mode 100644 autoload/vimspector/internal/neochannel.vim diff --git a/autoload/vimspector/internal/channel.vim b/autoload/vimspector/internal/channel.vim index 9825c5d..4c3d1d9 100644 --- a/autoload/vimspector/internal/channel.vim +++ b/autoload/vimspector/internal/channel.vim @@ -25,11 +25,6 @@ _vimspector_session.OnChannelData( vim.eval( 'a:data' ) ) EOF endfunction -function! s:_OnServerError( channel, data ) abort - echom 'Channel received error: ' . a:data - redraw -endfunction - function! s:_OnClose( channel ) abort echom 'Channel closed' redraw diff --git a/autoload/vimspector/internal/neochannel.vim b/autoload/vimspector/internal/neochannel.vim new file mode 100644 index 0000000..22bc5d2 --- /dev/null +++ b/autoload/vimspector/internal/neochannel.vim @@ -0,0 +1,85 @@ +" vimspector - A multi-language debugging system for Vim +" Copyright 2020 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! s:_OnEvent( chan_id, data, event ) abort + if a:data == [''] + echom 'Channel closed' + redraw + unlet s:ch + py3 _vimspector_session.OnServerExit( 0 ) + else + py3 _vimspector_session.OnChannelData( '\n'.join( vim.eval( 'a:data' ) ) ) + endif +endfunction + +function! vimspector#internal#neochannel#StartDebugSession( config ) abort + if exists( 's:ch' ) + echom 'Not starging: Channel is already running' + redraw + return v:false + endif + + let addr = 'localhost:' . a:config[ 'port' ] + + let s:ch = sockconnect( 'tcp', addr, { 'on_data': funcref( 's:_OnEvent' ) } ) + if s:ch <= 0 + unlet s:ch + return v:false + endif + + return v:true +endfunction + +function! vimspector#internal#neochannel#Send( msg ) abort + if ! exists( 's:ch' ) + echom "Can't send message: Channel was not initialised correctly" + redraw + return 0 + endif + + call chansend( s:ch, a:msg ) + return 1 +endfunction + +function! vimspector#internal#neochannel#StopDebugSession() abort + if !exists( 's:ch' ) + echom "Not stopping session: Channel doesn't exist" + redraw + return + endif + + call chanclose( s:ch ) + " It doesn't look like we get a callback after chanclos. Who knows if we will + " subsequently receive data callbacks. + call s:_OnEvent( s:ch, [ '' ], 'data' ) +endfunction + +function! vimspector#internal#neochannel#Reset() abort + call vimspector#internal#neochannel#StopDebugSession() +endfunction + +" Boilerplate {{{ +let &cpoptions=s:save_cpo +unlet s:save_cpo +" }}} + diff --git a/autoload/vimspector/internal/neojob.vim b/autoload/vimspector/internal/neojob.vim index 64ef934..c88a319 100644 --- a/autoload/vimspector/internal/neojob.vim +++ b/autoload/vimspector/internal/neojob.vim @@ -1,5 +1,5 @@ " vimspector - A multi-language debugging system for Vim -" Copyright 2018 Ben Jackson +" Copyright 2020 Ben Jackson " " Licensed under the Apache License, Version 2.0 (the "License"); " you may not use this file except in compliance with the License.