Skip to content

Commit

Permalink
Add foreground dispatch support for screen
Browse files Browse the repository at this point in the history
  • Loading branch information
vedknom committed Apr 22, 2015
1 parent dcce6d3 commit 70f3990
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 12 deletions.
19 changes: 13 additions & 6 deletions autoload/dispatch.vim
Original file line number Diff line number Diff line change
Expand Up @@ -98,29 +98,36 @@ 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
return 'trap ' . shellescape(after) . ' EXIT INT TERM HUP; ' . exec
else
" csh
return exec . '; ' . after
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
Expand Down
38 changes: 34 additions & 4 deletions autoload/dispatch/screen.vim
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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
3 changes: 1 addition & 2 deletions autoload/dispatch/tmux.vim
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 70f3990

Please sign in to comment.