diff options
author | Adam Stankiewicz <sheerun@sher.pl> | 2020-04-25 21:30:46 +0200 |
---|---|---|
committer | Adam Stankiewicz <sheerun@sher.pl> | 2020-04-25 21:30:46 +0200 |
commit | d757bfd643cc73c2d495355c153ed0257f5d5b47 (patch) | |
tree | ff210950456938a779d98f6a2ba7321aca512897 /autoload/vimtex/process.vim | |
parent | 8ec73a3a8974a62a613680a6b6222a77a7b99546 (diff) | |
download | vim-polyglot-d757bfd643cc73c2d495355c153ed0257f5d5b47.tar.gz vim-polyglot-d757bfd643cc73c2d495355c153ed0257f5d5b47.zip |
Change latex provider to luatex, closes #476
Diffstat (limited to 'autoload/vimtex/process.vim')
-rw-r--r-- | autoload/vimtex/process.vim | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/autoload/vimtex/process.vim b/autoload/vimtex/process.vim new file mode 100644 index 00000000..a22709c3 --- /dev/null +++ b/autoload/vimtex/process.vim @@ -0,0 +1,233 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'latex') == -1 + +" vimtex - LaTeX plugin for Vim +" +" Maintainer: Karl Yngve LervÄg +" Email: karl.yngve@gmail.com +" + +function! vimtex#process#new(...) abort " {{{1 + let l:opts = a:0 > 0 ? a:1 : {} + return extend(deepcopy(s:process), l:opts) +endfunction + +" }}}1 +function! vimtex#process#run(cmd, ...) abort " {{{1 + let l:opts = a:0 > 0 ? a:1 : {} + let l:opts.cmd = a:cmd + let l:process = vimtex#process#new(l:opts) + + return l:process.run() +endfunction + +" }}}1 +function! vimtex#process#capture(cmd) abort " {{{1 + return vimtex#process#run(a:cmd, {'capture': 1}) +endfunction + +" }}}1 +function! vimtex#process#start(cmd, ...) abort " {{{1 + let l:opts = a:0 > 0 ? a:1 : {} + let l:opts.continuous = 1 + return vimtex#process#run(a:cmd, l:opts) +endfunction + +" }}}1 + +let s:process = { + \ 'cmd' : '', + \ 'pid' : 0, + \ 'background' : 1, + \ 'continuous' : 0, + \ 'output' : '', + \ 'workdir' : '', + \ 'silent' : 1, + \ 'capture' : 0, + \ 'result' : '', + \} + +function! s:process.run() abort dict " {{{1 + if self._do_not_run() | return | endif + + call self._pre_run() + call self._prepare() + call self._execute() + call self._restore() + call self._post_run() + + return self.capture ? self.result : self +endfunction + +" }}}1 +function! s:process.stop() abort dict " {{{1 + if !self.pid | return | endif + + let l:cmd = has('win32') + \ ? 'taskkill /PID ' . self.pid . ' /T /F' + \ : 'kill ' . self.pid + call vimtex#process#run(l:cmd, {'background': 0}) + + let self.pid = 0 +endfunction + +" }}}1 +function! s:process.pprint_items() abort dict " {{{1 + let l:list = [ + \ ['pid', self.pid ? self.pid : '-'], + \ ['cmd', get(self, 'prepared_cmd', self.cmd)], + \] + + return l:list +endfunction + +" }}}1 + +function! s:process._do_not_run() abort dict " {{{1 + if empty(self.cmd) + call vimtex#log#warning('Can''t run empty command') + return 1 + endif + if self.pid + call vimtex#log#warning('Process already running!') + return 1 + endif + + return 0 +endfunction + +" }}}1 +function! s:process._pre_run() abort dict " {{{1 + if self.capture + let self.silent = 0 + let self.background = 0 + elseif empty(self.output) && self.background + let self.output = 'null' + endif + + call vimtex#paths#pushd(self.workdir) +endfunction + +" }}}1 +function! s:process._execute() abort dict " {{{1 + if self.capture + let self.result = split(system(self.prepared_cmd), '\n') + elseif self.silent + silent call system(self.prepared_cmd) + elseif self.background + silent execute '!' . self.prepared_cmd + if !has('gui_running') + redraw! + endif + else + execute '!' . self.prepared_cmd + endif + + " Capture the pid if relevant + if has_key(self, 'set_pid') && self.continuous + call self.set_pid() + endif +endfunction + +" }}}1 +function! s:process._post_run() abort dict " {{{1 + call vimtex#paths#popd() +endfunction + +" }}}1 + +if has('win32') + function! s:process._prepare() abort dict " {{{1 + if &shell !~? 'cmd' + let self.win32_restore_shell = 1 + let self.win32_saved_shell = [ + \ &shell, + \ &shellcmdflag, + \ &shellxquote, + \ &shellxescape, + \ &shellquote, + \ &shellpipe, + \ &shellredir, + \ &shellslash + \] + set shell& shellcmdflag& shellxquote& shellxescape& + set shellquote& shellpipe& shellredir& shellslash& + else + let self.win32_restore_shell = 0 + endif + + let l:cmd = self.cmd + + if self.background + if !empty(self.output) + let l:cmd .= self.output ==# 'null' + \ ? ' >nul' + \ : ' >' . self.output + let l:cmd = 'cmd /s /c "' . l:cmd . '"' + else + let l:cmd = 'cmd /c "' . l:cmd . '"' + endif + let l:cmd = 'start /b ' . cmd + endif + + if self.silent && self.output ==# 'null' + let self.prepared_cmd = '"' . l:cmd . '"' + else + let self.prepared_cmd = l:cmd + endif + endfunction + + " }}}1 + function! s:process._restore() abort dict " {{{1 + if self.win32_restore_shell + let [ &shell, + \ &shellcmdflag, + \ &shellxquote, + \ &shellxescape, + \ &shellquote, + \ &shellpipe, + \ &shellredir, + \ &shellslash] = self.win32_saved_shell + endif + endfunction + + " }}}1 + function! s:process.get_pid() abort dict " {{{1 + let self.pid = 0 + endfunction + + " }}}1 +else + function! s:process._prepare() abort dict " {{{1 + let l:cmd = self.cmd + + if self.background + if !empty(self.output) + let l:cmd .= ' >' + \ . (self.output ==# 'null' + \ ? '/dev/null' + \ : shellescape(self.output)) + \ . ' 2>&1' + endif + let l:cmd .= ' &' + endif + + if !self.silent + let l:cmd = escape(l:cmd, '%#') + endif + + let self.prepared_cmd = l:cmd + endfunction + + " }}}1 + function! s:process._restore() abort dict " {{{1 + endfunction + + " }}}1 + function! s:process.get_pid() abort dict " {{{1 + let self.pid = 0 + endfunction + + " }}}1 +endif + +endif |