1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-02-03 22:10:05 +08:00
SpaceVim/bundle/dein.vim/autoload/vital/_dein/System/Job/Neovim.vim

172 lines
4.7 KiB
VimL
Raw Normal View History

2020-06-13 14:06:35 +08:00
" ___vital___
" NOTE: lines between '" ___vital___' is generated by :Vitalize.
" Do not modify the code nor insert new lines before '" ___vital___'
2020-06-13 14:06:35 +08:00
function! s:_SID() abort
return matchstr(expand('<sfile>'), '<SNR>\zs\d\+\ze__SID$')
endfunction
execute join(['function! vital#_dein#System#Job#Neovim#import() abort', printf("return map({'is_available': '', 'start': ''}, \"vital#_dein#function('<SNR>%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n")
delfunction s:_SID
" ___vital___
" http://vim-jp.org/blog/2016/03/23/take-care-of-patch-1577.html
function! s:is_available() abort
return has('nvim') && has('nvim-0.2.0')
endfunction
function! s:start(args, options) abort
let job = extend(copy(s:job), a:options)
let job_options = {
\ 'stderr_buffered': v:false,
\ 'stdout_buffered': v:false
\ }
2020-06-13 14:06:35 +08:00
if has_key(a:options, 'cwd')
let job_options.cwd = a:options.cwd
endif
if has_key(a:options, 'env')
let job_options.env = a:options.env
endif
2020-06-13 14:06:35 +08:00
if has_key(job, 'on_stdout')
let job_options.on_stdout = funcref('s:_on_stdout', [job])
2020-06-13 14:06:35 +08:00
endif
if has_key(job, 'on_stderr')
let job_options.on_stderr = funcref('s:_on_stderr', [job])
2020-06-13 14:06:35 +08:00
endif
if has_key(job, 'on_exit')
let job_options.on_exit = funcref('s:_on_exit', [job])
2020-06-13 14:06:35 +08:00
else
let job_options.on_exit = funcref('s:_on_exit_raw', [job])
2020-06-13 14:06:35 +08:00
endif
let job.__job = jobstart(a:args, job_options)
let job.__pid = s:_jobpid_safe(job.__job)
2020-06-13 14:06:35 +08:00
let job.__exitval = v:null
let job.args = a:args
return job
endfunction
if has('nvim-0.3.0')
" Neovim 0.3.0 and over seems to invoke on_stdout/on_stderr with an empty
" string data when the stdout/stderr channel has closed.
" It is different behavior from Vim and Neovim prior to 0.3.0 so remove an
" empty string list to keep compatibility.
function! s:_on_stdout(job, job_id, data, event) abort
if a:data == ['']
return
endif
call a:job.on_stdout(a:data)
endfunction
2020-06-13 14:06:35 +08:00
function! s:_on_stderr(job, job_id, data, event) abort
if a:data == ['']
return
endif
call a:job.on_stderr(a:data)
endfunction
else
function! s:_on_stdout(job, job_id, data, event) abort
call a:job.on_stdout(a:data)
endfunction
function! s:_on_stderr(job, job_id, data, event) abort
call a:job.on_stderr(a:data)
endfunction
endif
2020-06-13 14:06:35 +08:00
function! s:_on_exit(job, job_id, exitval, event) abort
let a:job.__exitval = a:exitval
call a:job.on_exit(a:exitval)
endfunction
function! s:_on_exit_raw(job, job_id, exitval, event) abort
let a:job.__exitval = a:exitval
endfunction
function! s:_jobpid_safe(job) abort
try
return jobpid(a:job)
catch /^Vim\%((\a\+)\)\=:E900/
" NOTE:
" Vim does not raise exception even the job has already closed so fail
" silently for 'E900: Invalid job id' exception
return 0
endtry
endfunction
2020-06-13 14:06:35 +08:00
" Instance -------------------------------------------------------------------
function! s:_job_id() abort dict
if &verbose
echohl WarningMsg
echo 'vital: System.Job: job.id() is deprecated. Use job.pid() instead.'
echohl None
endif
return self.pid()
endfunction
function! s:_job_pid() abort dict
return self.__pid
2020-06-13 14:06:35 +08:00
endfunction
function! s:_job_status() abort dict
try
sleep 1m
call jobpid(self.__job)
return 'run'
catch /^Vim\%((\a\+)\)\=:E900/
return 'dead'
endtry
endfunction
if exists('*chansend') " Neovim 0.2.3
function! s:_job_send(data) abort dict
return chansend(self.__job, a:data)
endfunction
else
function! s:_job_send(data) abort dict
return jobsend(self.__job, a:data)
endfunction
endif
if exists('*chanclose') " Neovim 0.2.3
function! s:_job_close() abort dict
call chanclose(self.__job, 'stdin')
endfunction
else
function! s:_job_close() abort dict
call jobclose(self.__job, 'stdin')
endfunction
endif
function! s:_job_stop() abort dict
try
call jobstop(self.__job)
catch /^Vim\%((\a\+)\)\=:E900/
" NOTE:
" Vim does not raise exception even the job has already closed so fail
" silently for 'E900: Invalid job id' exception
endtry
endfunction
function! s:_job_wait(...) abort dict
let timeout = a:0 ? a:1 : v:null
let exitval = timeout is# v:null
\ ? jobwait([self.__job])[0]
\ : jobwait([self.__job], timeout)[0]
if exitval != -3
return exitval
endif
" Wait until 'on_exit' callback is called
while self.__exitval is# v:null
sleep 1m
endwhile
return self.__exitval
endfunction
" To make debug easier, use funcref instead.
let s:job = {
\ 'id': funcref('s:_job_id'),
\ 'pid': funcref('s:_job_pid'),
\ 'status': funcref('s:_job_status'),
\ 'send': funcref('s:_job_send'),
\ 'close': funcref('s:_job_close'),
\ 'stop': funcref('s:_job_stop'),
\ 'wait': funcref('s:_job_wait'),
2020-06-13 14:06:35 +08:00
\}