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/compiler/latexrun.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/compiler/latexrun.vim')
-rw-r--r-- | autoload/vimtex/compiler/latexrun.vim | 250 |
1 files changed, 250 insertions, 0 deletions
diff --git a/autoload/vimtex/compiler/latexrun.vim b/autoload/vimtex/compiler/latexrun.vim new file mode 100644 index 00000000..01ebc02f --- /dev/null +++ b/autoload/vimtex/compiler/latexrun.vim @@ -0,0 +1,250 @@ +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#compiler#latexrun#init(options) abort " {{{1 + let l:compiler = deepcopy(s:compiler) + + call l:compiler.init(extend(a:options, + \ get(g:, 'vimtex_compiler_latexrun', {}), 'keep')) + + return l:compiler +endfunction + +" }}}1 + +let s:compiler = { + \ 'name' : 'latexrun', + \ 'backend' : has('nvim') ? 'nvim' + \ : v:version >= 800 ? 'jobs' : 'process', + \ 'root' : '', + \ 'target' : '', + \ 'target_path' : '', + \ 'background' : 1, + \ 'build_dir' : '', + \ 'output' : tempname(), + \ 'options' : [ + \ '--verbose-cmds', + \ '--latex-args="-synctex=1"', + \ ], + \} + +function! s:compiler.init(options) abort dict " {{{1 + call extend(self, a:options) + + if !executable('latexrun') + call vimtex#log#warning('latexrun is not executable!') + throw 'vimtex: Requirements not met' + endif + + call extend(self, deepcopy(s:compiler_{self.backend})) + + " Processes run with the new jobs api will not run in the foreground + if self.backend !=# 'process' + let self.background = 1 + endif +endfunction + +" }}}1 + +function! s:compiler.build_cmd() abort dict " {{{1 + let l:cmd = 'latexrun' + + for l:opt in self.options + let l:cmd .= ' ' . l:opt + endfor + + let l:cmd .= ' --latex-cmd ' . self.get_engine() + + let l:cmd .= ' -O ' + \ . (empty(self.build_dir) ? '.' : fnameescape(self.build_dir)) + + return l:cmd . ' ' . vimtex#util#shellescape(self.target) +endfunction + +" }}}1 +function! s:compiler.get_engine() abort dict " {{{1 + return get(extend(g:vimtex_compiler_latexrun_engines, + \ { + \ '_' : 'pdflatex', + \ 'pdflatex' : 'pdflatex', + \ 'lualatex' : 'lualatex', + \ 'xelatex' : 'xelatex', + \ }, 'keep'), self.tex_program, '_') +endfunction + +" }}}1 +function! s:compiler.cleanup() abort dict " {{{1 + " Pass +endfunction + +" }}}1 +function! s:compiler.pprint_items() abort dict " {{{1 + let l:configuration = [] + + if self.backend ==# 'process' + call add(l:configuration, ['background', self.background]) + endif + + if !empty(self.build_dir) + call add(l:configuration, ['build_dir', self.build_dir]) + endif + call add(l:configuration, ['latexrun options', self.options]) + call add(l:configuration, ['latexrun engine', self.get_engine()]) + + let l:list = [] + call add(l:list, ['backend', self.backend]) + if self.background + call add(l:list, ['output', self.output]) + endif + + if self.target_path !=# b:vimtex.tex + call add(l:list, ['root', self.root]) + call add(l:list, ['target', self.target_path]) + endif + + call add(l:list, ['configuration', l:configuration]) + + if has_key(self, 'process') + call add(l:list, ['process', self.process]) + endif + + if has_key(self, 'job') + call add(l:list, ['cmd', self.cmd]) + endif + + return l:list +endfunction + +" }}}1 + +function! s:compiler.clean(...) abort dict " {{{1 + let l:cmd = (has('win32') + \ ? 'cd /D "' . self.root . '" & ' + \ : 'cd ' . vimtex#util#shellescape(self.root) . '; ') + \ . 'latexrun --clean-all' + \ . ' -O ' + \ . (empty(self.build_dir) ? '.' : fnameescape(self.build_dir)) + call vimtex#process#run(l:cmd) + + call vimtex#log#info('Compiler clean finished') +endfunction + +" }}}1 +function! s:compiler.start(...) abort dict " {{{1 + call self.exec() + + if self.background + call vimtex#log#info('Compiler started in background') + else + call vimtex#compiler#callback(!vimtex#qf#inquire(self.target)) + endif +endfunction + +" }}}1 +function! s:compiler.start_single() abort dict " {{{1 + call self.start() +endfunction + +" }}}1 +function! s:compiler.stop() abort dict " {{{1 + " Pass +endfunction + +" }}}1 +function! s:compiler.is_running() abort dict " {{{1 + return 0 +endfunction + +" }}}1 +function! s:compiler.kill() abort dict " {{{1 + " Pass +endfunction + +" }}}1 +function! s:compiler.get_pid() abort dict " {{{1 + return 0 +endfunction + +" }}}1 + +let s:compiler_process = {} +function! s:compiler_process.exec() abort dict " {{{1 + let self.process = vimtex#process#new() + let self.process.name = 'latexrun' + let self.process.background = self.background + let self.process.workdir = self.root + let self.process.output = self.output + let self.process.cmd = self.build_cmd() + call self.process.run() +endfunction + +" }}}1 + +let s:compiler_jobs = {} +function! s:compiler_jobs.exec() abort dict " {{{1 + let self.cmd = self.build_cmd() + let l:cmd = has('win32') + \ ? 'cmd /s /c "' . self.cmd . '"' + \ : ['sh', '-c', self.cmd] + let l:options = { + \ 'out_io' : 'file', + \ 'err_io' : 'file', + \ 'out_name' : self.output, + \ 'err_name' : self.output, + \} + + let s:cb_target = self.target_path !=# b:vimtex.tex ? self.target_path : '' + let l:options.exit_cb = function('s:callback') + + call vimtex#paths#pushd(self.root) + let self.job = job_start(l:cmd, l:options) + call vimtex#paths#popd() +endfunction + +" }}}1 +function! s:callback(ch, msg) abort " {{{1 + call vimtex#compiler#callback(!vimtex#qf#inquire(s:cb_target)) +endfunction + +" }}}1 + +let s:compiler_nvim = {} +function! s:compiler_nvim.exec() abort dict " {{{1 + let self.cmd = self.build_cmd() + let l:cmd = has('win32') + \ ? 'cmd /s /c "' . self.cmd . '"' + \ : ['sh', '-c', self.cmd] + + let l:shell = { + \ 'on_stdout' : function('s:callback_nvim_output'), + \ 'on_stderr' : function('s:callback_nvim_output'), + \ 'on_exit' : function('s:callback_nvim_exit'), + \ 'cwd' : self.root, + \ 'target' : self.target_path, + \ 'output' : self.output, + \} + + let self.job = jobstart(l:cmd, l:shell) +endfunction + +" }}}1 +function! s:callback_nvim_output(id, data, event) abort dict " {{{1 + if !empty(a:data) + call writefile(filter(a:data, '!empty(v:val)'), self.output, 'a') + endif +endfunction + +" }}}1 +function! s:callback_nvim_exit(id, data, event) abort dict " {{{1 + let l:target = self.target !=# b:vimtex.tex ? self.target : '' + call vimtex#compiler#callback(!vimtex#qf#inquire(l:target)) +endfunction + +" }}}1 + +endif |