|
| 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 |
0 commit comments