Skip to content

Instantly share code, notes, and snippets.

@lambdalisue
Created April 21, 2018 18:08
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save lambdalisue/06366815fd1682400bd15850ab61e7f7 to your computer and use it in GitHub Desktop.
Executor.vim
function! s:_vital_loaded(V) abort
let s:Job = a:V.import('System.Job')
let s:Promise = a:V.import('Async.Promise')
endfunction
function! s:_vital_depends() abort
return ['System.Job', 'Async.Promise']
endfunction
function! s:execute_script(script, receiver) abort
let tempfile = tempname()
call writefile(a:script, tempfile)
return s:execute_scriptfile(tempfile, a:receiver)
endfunction
function! s:execute_scriptfile(scriptfile, receiver) abort
let args = s:_build_args(a:scriptfile)
let stderr = ['']
call themis#log(string(args))
return s:Promise.new({
\ rv, rj -> s:Job.start(args, {
\ 'previous': '',
\ 'receiver': a:receiver,
\ 'on_stdout': funcref('s:_on_stdout'),
\ 'on_stderr': funcref('s:_on_stderr', [stderr]),
\ 'on_exit': {e -> e ? rj(stderr) : rv()},
\ })
\})
endfunction
if has('nvim')
function! s:_build_args(scriptfile) abort
return [
\ 'nvim',
\ '-enN',
\ '-u', 'NONE', '--noplugin',
\ '--headless',
\ '-c', 'command! -nargs=1 Yield echo <args> | echo ""',
\ '-c', 'source ' . a:scriptfile,
\ '-c', 'quit',
\]
endfunction
else
function! s:_build_args(scriptfile) abort
return [
\ 'vim',
\ '-enN',
\ '-u', 'NONE', '--noplugin',
\ '-c', 'command! -nargs=1 Yield call writefile([<args>], "/dev/stdout")',
\ '-c', 'source ' . fnameescape(a:scriptfile),
\ '-c', 'quit',
\]
endfunction
endif
function! s:_on_stdout(data) abort dict
let self.previous .= a:data[0]
if len(a:data) > 1
call self.receiver([self.previous] + a:data[1:-2])
let self.previous = a:data[-1]
endif
endfunction
function! s:_on_stderr(stderr, data) abort dict
let a:stderr[-1] .= a:data[0]
call extend(a:stderr, a:data[1:])
endfunction
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment