Skip to content

Commit 3d19c59

Browse files
committed
Add foreground dispatch support for screen
1 parent dcce6d3 commit 3d19c59

File tree

3 files changed

+47
-11
lines changed

3 files changed

+47
-11
lines changed

autoload/dispatch.vim

+12-5
Original file line numberDiff line numberDiff line change
@@ -98,18 +98,19 @@ function! dispatch#callback(request) abort
9898
return ''
9999
endfunction
100100

101-
function! dispatch#prepare_start(request, ...) abort
101+
function! s:prepare_start(request, aftercmd, appendpipe) abort
102102
let exec = 'echo $$ > ' . a:request.file . '.pid; '
103103
if executable('perl')
104104
let exec .= 'perl -e "select(undef,undef,undef,0.1)" 2>/dev/null; '
105105
else
106106
let exec .= 'sleep 1; '
107107
endif
108-
let exec .= a:0 ? a:1 : a:request.expanded
108+
let exec .= a:request.expanded . (a:appendpipe ? dispatch#shellpipe(a:request.file) : '')
109109
let callback = dispatch#callback(a:request)
110110
let after = 'rm -f ' . a:request.file . '.pid; ' .
111111
\ 'touch ' . a:request.file . '.complete' .
112-
\ (empty(callback) ? '' : '; ' . callback)
112+
\ (empty(callback) ? '' : '; ' . callback) .
113+
\ (empty(a:aftercmd) ? '' : '; ' . a:aftercmd)
113114
if &shellpipe =~# '2>&1'
114115
return 'trap ' . shellescape(after) . ' EXIT INT TERM; ' . exec
115116
else
@@ -118,9 +119,15 @@ function! dispatch#prepare_start(request, ...) abort
118119
endif
119120
endfunction
120121

122+
function! dispatch#prepare_start(request, ...) abort
123+
let aftercmd = a:0 >= 1 ? a:1 : ''
124+
return s:prepare_start(request, aftercmd, 0)
125+
endfunction
126+
121127
function! dispatch#prepare_make(request, ...) abort
122-
let exec = a:0 ? a:1 : (a:request.expanded . dispatch#shellpipe(a:request.file))
123-
return dispatch#prepare_start(a:request, exec, 1)
128+
let aftercmd = a:0 >= 1 ? a:1 : ''
129+
let appendpipe = a:0 >= 2 ? a:2 : 1
130+
return s:prepare_start(a:request, aftercmd, appendpipe)
124131
endfunction
125132

126133
function! dispatch#set_title(request) abort

autoload/dispatch/screen.vim

+34-4
Original file line numberDiff line numberDiff line change
@@ -5,29 +5,43 @@ if exists('g:autoloaded_dispatch_screen')
55
endif
66
let g:autoloaded_dispatch_screen = 1
77

8+
let s:waiting = {}
9+
810
function! dispatch#screen#handle(request) abort
911
if empty($STY) || !executable('screen')
1012
return 0
1113
endif
14+
let aftercmd = 'screen -X only; screen -X at $WINDOW kill'
1215
if a:request.action ==# 'make'
13-
if !get(a:request, 'background', 0) && empty(v:servername)
16+
if !get(a:request, 'background', 0) && empty(v:servername) && !empty(s:waiting)
1417
return 0
1518
endif
16-
return dispatch#screen#spawn(dispatch#prepare_make(a:request), a:request)
19+
let cmd = dispatch#prepare_make(a:request, aftercmd)
20+
return dispatch#screen#spawn(cmd, a:request)
1721
elseif a:request.action ==# 'start'
18-
return dispatch#screen#spawn(dispatch#prepare_start(a:request), a:request)
22+
let cmd = dispatch#prepare_start(a:request, aftercmd)
23+
return dispatch#screen#spawn(cmd, a:request)
1924
endif
2025
endfunction
2126

2227
function! dispatch#screen#spawn(command, request) abort
23-
let command = 'screen -ln -fn -t '.dispatch#shellescape(a:request.title)
28+
let command = ''
29+
if !get(a:request, 'background', 0)
30+
silent execute "!screen -X eval 'split' 'focus down' 'resize 10'"
31+
endif
32+
let command .= 'screen -ln -fn -t '.dispatch#shellescape(a:request.title)
2433
\ . ' ' . &shell . ' ' . &shellcmdflag . ' '
2534
\ . shellescape('exec ' . dispatch#isolate(['STY', 'WINDOW'],
2635
\ dispatch#set_title(a:request), a:command))
2736
silent execute '!' . escape(command, '!#%')
37+
2838
if a:request.background
2939
silent !screen -X other
40+
else
41+
silent !screen -X focus up
3042
endif
43+
44+
let s:waiting = a:request
3145
return 1
3246
endfunction
3347

@@ -42,3 +56,19 @@ function! dispatch#screen#activate(pid) abort
4256
return !v:shell_error
4357
endif
4458
endfunction
59+
60+
function! dispatch#screen#poll() abort
61+
if empty(s:waiting)
62+
return
63+
endif
64+
let request = s:waiting
65+
if !dispatch#pid(request)
66+
let s:waiting = {}
67+
call dispatch#complete(request)
68+
endif
69+
endfunction
70+
71+
augroup dispatch_screen
72+
autocmd!
73+
autocmd VimResized * if !has('gui_running') | call dispatch#screen#poll() | endif
74+
augroup END

autoload/dispatch/tmux.vim

+1-2
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,7 @@ function! dispatch#tmux#make(request) abort
3737
\ && a:request.format !~# '%\\[er]'
3838
let session = get(g:, 'tmux_session', '')
3939
let script = dispatch#isolate(['TMUX', 'TMUX_PANE'],
40-
\ call('dispatch#prepare_make',
41-
\ [a:request] + (pipepane ? [a:request.expanded] : [])))
40+
\ dispatch#prepare_make(a:request, '', !pipepane))
4241

4342
let title = shellescape(get(a:request, 'title', get(a:request, 'compiler', 'make')))
4443
if get(a:request, 'background', 0)

0 commit comments

Comments
 (0)