mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-01-24 09:50:04 +08:00
90 lines
2.8 KiB
VimL
Vendored
90 lines
2.8 KiB
VimL
Vendored
" dispatch.vim Windows strategy
|
|
|
|
if exists('g:autoloaded_dispatch_windows')
|
|
finish
|
|
endif
|
|
let g:autoloaded_dispatch_windows = 1
|
|
|
|
function! dispatch#windows#escape(str) abort
|
|
if &shellxquote ==# '"'
|
|
return '"' . substitute(a:str, '"', '""', 'g') . '"'
|
|
else
|
|
let esc = exists('+shellxescape') ? &shellxescape : '"&|<>()@^'
|
|
return &shellxquote .
|
|
\ substitute(a:str, '['.esc.']', '^&', 'g') .
|
|
\ get({'(': ')', '"(': ')"'}, &shellxquote, &shellxquote)
|
|
endif
|
|
endfunction
|
|
|
|
function! dispatch#windows#handle(request) abort
|
|
if !has('win32') || empty(v:servername)
|
|
return 0
|
|
endif
|
|
if a:request.action ==# 'make'
|
|
return dispatch#windows#make(a:request)
|
|
elseif a:request.action ==# 'start'
|
|
return dispatch#windows#start(a:request)
|
|
endif
|
|
endfunction
|
|
|
|
function! dispatch#windows#spawn(title, exec, background) abort
|
|
let extra = a:background ? ' /min' : ''
|
|
silent execute dispatch#bang('start /min cmd.exe /cstart ' .
|
|
\ '"' . substitute(a:title, '"', '', 'g') . '"' . extra . ' ' .
|
|
\ &shell . ' ' . &shellcmdflag . ' ' . dispatch#windows#escape(a:exec))
|
|
return 1
|
|
endfunction
|
|
|
|
let s:pid = "wmic process where ^(Name='WMIC.exe' AND CommandLine LIKE '\\%\\%\\%TIME\\%\\%\\%'^) get ParentProcessId | more +1 > "
|
|
|
|
function! dispatch#windows#make(request) abort
|
|
if &shellxquote ==# '"'
|
|
let exec = dispatch#prepare_make(a:request)
|
|
else
|
|
let pidfile = a:request.file.'.pid'
|
|
let exec =
|
|
\ s:pid . pidfile .
|
|
\ ' & ' . a:request.expanded .
|
|
\ ' > ' . a:request.file . ' 2>&1' .
|
|
\ ' & echo %ERRORLEVEL% > ' . a:request.file . '.complete' .
|
|
\ ' & ' . dispatch#callback(a:request)
|
|
endif
|
|
|
|
return dispatch#windows#spawn(a:request.title, exec, 1)
|
|
endfunction
|
|
|
|
function! dispatch#windows#start(request) abort
|
|
if &shellxquote ==# '"'
|
|
let exec = dispatch#prepare_start(a:request)
|
|
else
|
|
let pidfile = a:request.file.'.pid'
|
|
let pause = get({'always': ' & pause', 'never': ''},
|
|
\ get(a:request, 'wait'), ' || pause')
|
|
let exec =
|
|
\ s:pid . pidfile .
|
|
\ ' & ' . a:request.expanded .
|
|
\ pause .
|
|
\ ' & cd . > ' . a:request.file.'.complete' .
|
|
\ ' & del ' . pidfile
|
|
endif
|
|
|
|
return dispatch#windows#spawn(a:request.title, exec, a:request.background)
|
|
endfunction
|
|
|
|
function! dispatch#windows#activate(pid) abort
|
|
let tasklist_cmd = 'tasklist /fi "pid eq '.a:pid.'"'
|
|
if &shellxquote ==# '"'
|
|
let tasklist_cmd = substitute(tasklist_cmd, '"', "'", "g")
|
|
endif
|
|
if system(tasklist_cmd) !~# '==='
|
|
return 0
|
|
endif
|
|
|
|
if !exists('s:activator')
|
|
let s:activator = tempname().'.vbs'
|
|
call writefile(['WScript.CreateObject("WScript.Shell").AppActivate(WScript.Arguments(0))'], s:activator)
|
|
endif
|
|
call system('cscript //nologo '.s:activator.' '.a:pid)
|
|
return !v:shell_error
|
|
endfunction
|