1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-02-03 02:50:06 +08:00

Add sync support

This commit is contained in:
wsdjeg 2017-04-22 14:44:47 +08:00
parent 607882765f
commit 3e8a2dddc1
3 changed files with 25 additions and 16 deletions

View File

@ -5,11 +5,10 @@ endfunction
" make vim and neovim use same job func. " make vim and neovim use same job func.
let s:self = {} let s:self = {}
let s:self.jobs = {} let s:self.jobs = {}
let s:self.nvim_job = has('nvim') let s:self.nvim_job = has('nvim') && 0
let s:self.vim_job = !has('nvim') && has('job') && has('patch-8.0.0027') let s:self.vim_job = !has('nvim') && has('job') && has('patch-8.0.0027') && 0
if !s:self.nvim_job && !s:self.vim_job let s:self.vim_co = SpaceVim#api#import('vim#compatible')
let s:self.vim_co = SpaceVim#api#import('vim#compatible')
endif
function! s:self.warn(...) abort function! s:self.warn(...) abort
if len(a:000) == 0 if len(a:000) == 0
echohl WarningMsg | echom 'Current version do not support job feature, fallback to sync system()' | echohl None echohl WarningMsg | echom 'Current version do not support job feature, fallback to sync system()' | echohl None
@ -98,16 +97,19 @@ function! s:self.start(argv, ...) abort
let opts = {} let opts = {}
endif endif
let output = self.vim_co.systemlist(a:argv) let output = self.vim_co.systemlist(a:argv)
let id = len(self.jobs) + 1 let id = -1
if v:shell_error if v:shell_error
if has_key(opts,'on_stderr') if has_key(opts,'on_stderr')
call call(opts.on_stderr, [id, output, 'on_stderr']) call call(opts.on_stderr, [id, output, 'stderr'])
endif endif
else else
if has_key(opts,'on_stdout') if has_key(opts,'on_stdout')
call call(opts.on_stderr, [id, output, 'on_stdout']) call call(opts.on_stdout, [id, output, 'stdout'])
endif endif
endif endif
if has_key(opts,'on_exit')
call call(opts.on_exit, [id, v:shell_error, 'exit'])
endif
return id return id
endif endif
endfunction endfunction

View File

@ -2,6 +2,7 @@ function! SpaceVim#api#vim#compatible#get() abort
return map({ return map({
\ 'execute' : '', \ 'execute' : '',
\ 'system' : '', \ 'system' : '',
\ 'systemlist' : '',
\ }, \ },
\ "function('s:' . v:key)" \ "function('s:' . v:key)"
\ ) \ )

View File

@ -3,7 +3,7 @@ Execute ( SpaceVim api: job ):
let argv = ['cat'] let argv = ['cat']
let g:stdout = '' let g:stdout = ''
let stderr = '' let stderr = ''
let exit = 1 let exit_data = 1
function! s:on_stdout(id, data, event) abort function! s:on_stdout(id, data, event) abort
if a:event ==# 'stdout' if a:event ==# 'stdout'
for a in a:data for a in a:data
@ -12,7 +12,7 @@ Execute ( SpaceVim api: job ):
endif endif
endfor endfor
elseif a:event ==# 'exit' elseif a:event ==# 'exit'
let g:exit = a:data let g:exit_data = a:data
else else
let g:stderr = a:data let g:stderr = a:data
endif endif
@ -23,11 +23,17 @@ Execute ( SpaceVim api: job ):
\ 'on_exit' : function('s:on_stdout'), \ 'on_exit' : function('s:on_stdout'),
\ } \ }
let jobid = job.start(argv,opt) let jobid = job.start(argv,opt)
call job.send(jobid, 'foo') if jobid >= 0
sleep 10m call job.send(jobid, 'foo')
AssertEqual stdout, 'foo' sleep 10m
AssertEqual job.status(jobid), 'run' AssertEqual stdout, 'foo'
call job.stop(jobid) AssertEqual job.status(jobid), 'run'
AssertEqual exit, 1 call job.stop(jobid)
AssertEqual exit_data, 1
else
let jobid = job.start(['echo', 'foo'],opt)
AssertEqual stdout, 'foo'
AssertEqual exit_data, 0
endif