Skip to content

Commit 682274e

Browse files
committed
Add Vim 8 job handler
1 parent d6927ff commit 682274e

File tree

3 files changed

+89
-0
lines changed

3 files changed

+89
-0
lines changed

autoload/dispatch.vim

+7
Original file line numberDiff line numberDiff line change
@@ -623,6 +623,10 @@ function! dispatch#compile_command(bang, args, count) abort
623623

624624
if s:dispatch(request)
625625
call s:cgetfile(request)
626+
if request.handler ==# 'job'
627+
exe 'botright copen' get(g:, 'dispatch_quickfix_height', '')
628+
wincmd p
629+
endif
626630
else
627631
let request.handler = 'sync'
628632
let after = 'call DispatchComplete('.request.id.')'
@@ -858,6 +862,9 @@ endfunction
858862

859863
function! s:cgetfile(request, ...) abort
860864
let request = s:request(a:request)
865+
if !has_key(request, 'handler')
866+
throw 'Bad request ' . string(request)
867+
endif
861868
let efm = &l:efm
862869
let makeprg = &l:makeprg
863870
let compiler = get(b:, 'current_compiler', '')

autoload/dispatch/job.vim

+81
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
" dispatch.vim job strategy
2+
3+
if exists('g:autoloaded_dispatch_job')
4+
finish
5+
endif
6+
let g:autoloaded_dispatch_job = 1
7+
8+
if !exists('s:waiting')
9+
let s:waiting = {}
10+
endif
11+
12+
function! dispatch#job#handle(request) abort
13+
if !has('job') || a:request.action !=# 'make'
14+
return 0
15+
endif
16+
call writefile([], a:request.file)
17+
let job = job_start([&shell, &shellcmdflag, a:request.expanded], {
18+
\ 'in_io': 'null',
19+
\ 'out_mode': 'nl',
20+
\ 'err_mode': 'nl',
21+
\ 'callback': function('s:output'),
22+
\ 'exit_cb': function('s:exit'),
23+
\ })
24+
let a:request.pid = job_info(job).process
25+
let ch_id = ch_info(job_info(job).channel).id
26+
let s:waiting[ch_id] = a:request
27+
call writefile([a:request.pid], a:request.file . '.pid')
28+
let a:request.handler = 'job'
29+
return 2
30+
endfunction
31+
32+
function! s:exit(job, status) abort
33+
let ch_id = ch_info(job_info(a:job).channel).id
34+
let request = s:waiting[ch_id]
35+
call writefile([a:status], request.file . '.complete')
36+
" unlet! s:waiting[ch_id]
37+
call DispatchComplete(request.id)
38+
endfunction
39+
40+
function! s:output(ch, output) abort
41+
let ch_id = ch_info(a:ch).id
42+
let request = s:waiting[ch_id]
43+
call writefile([a:output], request.file, 'a')
44+
45+
if dispatch#request(getqflist({'all': 1}).title) isnot# request
46+
return
47+
endif
48+
49+
let efm = &l:efm
50+
let makeprg = &l:makeprg
51+
let compiler = get(b:, 'current_compiler', '')
52+
let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd' : 'cd'
53+
let dir = getcwd()
54+
let modelines = &modelines
55+
try
56+
let &modelines = 0
57+
let b:current_compiler = get(request, 'compiler', '')
58+
if empty(b:current_compiler)
59+
unlet! b:current_compiler
60+
endif
61+
exe cd fnameescape(request.directory)
62+
let &l:efm = request.format
63+
let &l:makeprg = request.command
64+
caddexpr a:output
65+
finally
66+
let &modelines = modelines
67+
exe cd fnameescape(dir)
68+
let &l:efm = efm
69+
let &l:makeprg = makeprg
70+
if empty(compiler)
71+
unlet! b:current_compiler
72+
else
73+
let b:current_compiler = compiler
74+
endif
75+
endtry
76+
cbottom
77+
endfunction
78+
79+
function! dispatch#job#activate(pid) abort
80+
return 0
81+
endfunction

plugin/dispatch.vim

+1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ endfunction
3333

3434
if !exists('g:dispatch_handlers')
3535
let g:dispatch_handlers = [
36+
\ 'job',
3637
\ 'tmux',
3738
\ 'screen',
3839
\ 'windows',

0 commit comments

Comments
 (0)