diff --git a/autoload/dispatch.vim b/autoload/dispatch.vim index a309ab1..224b2f5 100644 --- a/autoload/dispatch.vim +++ b/autoload/dispatch.vim @@ -98,18 +98,19 @@ function! dispatch#callback(request) abort return '' endfunction -function! dispatch#prepare_start(request, ...) abort +function! s:prepare_start(request, aftercmd, appendpipe) abort let exec = 'echo $$ > ' . a:request.file . '.pid; ' if executable('perl') let exec .= 'perl -e "select(undef,undef,undef,0.1)" 2>/dev/null; ' else let exec .= 'sleep 1; ' endif - let exec .= a:0 ? a:1 : a:request.expanded + let exec .= a:request.expanded . (a:appendpipe ? dispatch#shellpipe(a:request.file) : '') let callback = dispatch#callback(a:request) let after = 'rm -f ' . a:request.file . '.pid; ' . \ 'touch ' . a:request.file . '.complete' . - \ (empty(callback) ? '' : '; ' . callback) + \ (empty(callback) ? '' : '; ' . callback) . + \ (empty(a:aftercmd) ? '' : '; ' . a:aftercmd) if &shellpipe =~# '2>&1' return 'trap ' . shellescape(after) . ' EXIT INT TERM; ' . exec else @@ -118,9 +119,15 @@ function! dispatch#prepare_start(request, ...) abort endif endfunction +function! dispatch#prepare_start(request, ...) abort + let aftercmd = a:0 >= 1 ? a:1 : '' + return s:prepare_start(request, aftercmd, 0) +endfunction + function! dispatch#prepare_make(request, ...) abort - let exec = a:0 ? a:1 : (a:request.expanded . dispatch#shellpipe(a:request.file)) - return dispatch#prepare_start(a:request, exec, 1) + let aftercmd = a:0 >= 1 ? a:1 : '' + let appendpipe = a:0 >= 2 ? a:2 : 1 + return s:prepare_start(a:request, aftercmd, appendpipe) endfunction function! dispatch#set_title(request) abort diff --git a/autoload/dispatch/screen.vim b/autoload/dispatch/screen.vim index 2e9702b..7636de8 100644 --- a/autoload/dispatch/screen.vim +++ b/autoload/dispatch/screen.vim @@ -5,29 +5,43 @@ if exists('g:autoloaded_dispatch_screen') endif let g:autoloaded_dispatch_screen = 1 +let s:waiting = {} + function! dispatch#screen#handle(request) abort if empty($STY) || !executable('screen') return 0 endif + let aftercmd = 'screen -X only; screen -X at $WINDOW kill' if a:request.action ==# 'make' - if !get(a:request, 'background', 0) && empty(v:servername) + if !get(a:request, 'background', 0) && empty(v:servername) && !empty(s:waiting) return 0 endif - return dispatch#screen#spawn(dispatch#prepare_make(a:request), a:request) + let cmd = dispatch#prepare_make(a:request, aftercmd) + return dispatch#screen#spawn(cmd, a:request) elseif a:request.action ==# 'start' - return dispatch#screen#spawn(dispatch#prepare_start(a:request), a:request) + let cmd = dispatch#prepare_start(a:request, aftercmd) + return dispatch#screen#spawn(cmd, a:request) endif endfunction function! dispatch#screen#spawn(command, request) abort - let command = 'screen -ln -fn -t '.dispatch#shellescape(a:request.title) + let command = '' + if !get(a:request, 'background', 0) + silent execute "!screen -X eval 'split' 'focus down' 'resize 10'" + endif + let command .= 'screen -ln -fn -t '.dispatch#shellescape(a:request.title) \ . ' ' . &shell . ' ' . &shellcmdflag . ' ' \ . shellescape('exec ' . dispatch#isolate(['STY', 'WINDOW'], \ dispatch#set_title(a:request), a:command)) silent execute '!' . escape(command, '!#%') + if a:request.background silent !screen -X other + else + silent !screen -X focus up endif + + let s:waiting = a:request return 1 endfunction @@ -42,3 +56,19 @@ function! dispatch#screen#activate(pid) abort return !v:shell_error endif endfunction + +function! dispatch#screen#poll() abort + if empty(s:waiting) + return + endif + let request = s:waiting + if !dispatch#pid(request) + let s:waiting = {} + call dispatch#complete(request) + endif +endfunction + +augroup dispatch_screen + autocmd! + autocmd VimResized * if !has('gui_running') | call dispatch#screen#poll() | endif +augroup END diff --git a/autoload/dispatch/tmux.vim b/autoload/dispatch/tmux.vim index a7f64c1..89d8e7a 100644 --- a/autoload/dispatch/tmux.vim +++ b/autoload/dispatch/tmux.vim @@ -37,8 +37,7 @@ function! dispatch#tmux#make(request) abort \ && a:request.format !~# '%\\[er]' let session = get(g:, 'tmux_session', '') let script = dispatch#isolate(['TMUX', 'TMUX_PANE'], - \ call('dispatch#prepare_make', - \ [a:request] + (pipepane ? [a:request.expanded] : []))) + \ dispatch#prepare_make(a:request, '', !pipepane)) let title = shellescape(get(a:request, 'title', get(a:request, 'compiler', 'make'))) if get(a:request, 'background', 0)