Ⅰ. 插件描述
normalize async job control api for vim and neovimⅡ. 基本信息
|
Ⅲ. 安装方法
使用Vundle管理器安装
在你的.vimrc下添加:Plugin 'prabirshrestha/async-vim'
… 然后在Vim中运行以下命令:
:source %
:PluginInstall
对于Vundle版本 < 0.10.2,请用上面的Bundle替换Plugin。
使用NeoBundle管理器安装
在你的.vimrc下添加:NeoBundle 'prabirshrestha/async-vim'
… 然后在Vim中运行以下命令:
:source %
:NeoBundleInstall
使用VimPlug管理器安装
在你的.vimrc下添加:Plug 'prabirshrestha/async-vim'
… 然后在Vim中运行以下命令:
:source %
:PlugInstall
使用Pathogen管理器安装
在终端中运行以下命令:cd ~/.vim/bundle
git clone https://github.com/prabirshrestha/async.vim
Ⅳ. 文档说明
# async.vim
normalize async job control api for vim and neovim
sample usage
function! s:handler(job_id, data, event_type)
echo a:job_id . ' ' . a:event_type
echo join(a:data, "\n")
endfunction
if has('win32') || has('win64')
let argv = ['cmd', '/c', 'dir c:\ /b']
else
let argv = ['bash', '-c', 'ls']
endif
let jobid = async#job#start(argv, {
\ 'on_stdout': function('s:handler'),
\ 'on_stderr': function('s:handler'),
\ 'on_exit': function('s:handler'),
\ })
if jobid > 0
echom 'job started'
else
echom 'job failed to start'
endif
" If you want to get the process id of the job
let pid = async#job#pid(jobid)
" If you want to wait the job:
call async#job#wait([jobid], 5000) " timeout: 5 sec
" If you want to stop the job:
call async#job#stop(jobid)
APIs
APIs are based on neovim's job control APIs.
Embedding
Async.vim can be either embedded with other plugins or be used as an external plugin.
If you want to embed all you need is to change these 5 function names async#job# to what ever you want. E.g.:
" public apis {{{
function! yourplugin#job#start(cmd, opts) abort
return s:job_start(a:cmd, a:opts)
endfunction
function! yourplugin#job#stop(jobid) abort
call s:job_stop(a:jobid)
endfunction
function! yourplugin#job#send(jobid, data) abort
call s:job_send(a:jobid, a:data)
endfunction
function! yourplugin#job#wait(jobids, ...) abort
let l:timeout = get(a:000, 0, -1)
return s:job_wait(a:jobids, l:timeout)
endfunction
function! yourplugin#job#pid(jobid) abort
return s:job_pid(a:jobid)
endfunction
" }}}
Todos
- Fallback to sync
system()
calls in vim that doesn't supportjob
job_stop
andjob_send
is treated as noop when usingsystem()
on_stderr
doesn't work when usingsystem()
- Fallback to python/ruby threads and vimproc instead of using
system()
for better compatibility (PRs welcome!!!)