" dispatch.vim GNU Screen strategy if exists('g:autoloaded_dispatch_screen') finish endif let g:autoloaded_dispatch_screen = 1 function! dispatch#screen#handle(request) abort if empty($STY) || !executable('screen') return 0 endif if a:request.action ==# 'make' if !get(a:request, 'background', 0) && !dispatch#has_callback() return 0 endif return dispatch#screen#spawn(dispatch#prepare_make(a:request), a:request) elseif a:request.action ==# 'start' return dispatch#screen#spawn(dispatch#prepare_start(a:request), a:request) endif endfunction function! dispatch#screen#spawn(command, request) abort let command = 'screen -ln -fn -t '.dispatch#shellescape(a:request.title) \ . ' ' . &shell . ' ' . &shellcmdflag . ' ' \ . shellescape('exec ' . dispatch#isolate(a:request, \ ['STY', 'WINDOW'], dispatch#set_title(a:request), a:command)) silent execute dispatch#bang(command) if (a:request.background || a:request.action !=# 'start') && !has('gui_running') && !has('nvim') silent !screen -X other endif return 1 endfunction function! dispatch#screen#activate(pid) abort let out = system('ps ewww -p '.a:pid) if empty($STY) || stridx(out, 'STY='.$STY) < 0 return 0 endif let window = matchstr(out, 'WINDOW=\zs\d\+') if !empty(window) silent execute '!screen -X select '.window return !v:shell_error endif endfunction