diff options
Diffstat (limited to 'autoload/vimtex/view/zathura.vim')
-rw-r--r-- | autoload/vimtex/view/zathura.vim | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/autoload/vimtex/view/zathura.vim b/autoload/vimtex/view/zathura.vim new file mode 100644 index 00000000..48e8e27a --- /dev/null +++ b/autoload/vimtex/view/zathura.vim @@ -0,0 +1,155 @@ +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#view#zathura#new() abort " {{{1 + " Check if the viewer is executable + if !executable('zathura') + call vimtex#log#error('Zathura is not executable!') + return {} + endif + + if executable('ldd') + let l:shared = split(system('ldd =zathura')) + if v:shell_error == 0 + \ && empty(filter(l:shared, 'v:val =~# ''libsynctex''')) + call vimtex#log#warning('Zathura is not linked to libsynctex!') + let s:zathura.has_synctex = 0 + endif + endif + + " Check if the xdotool is available + if !executable('xdotool') + call vimtex#log#warning('Zathura requires xdotool for forward search!') + endif + + " + " Use the xwin template + " + return vimtex#view#common#apply_xwin_template('Zathura', + \ vimtex#view#common#apply_common_template(deepcopy(s:zathura))) +endfunction + +" }}}1 + +let s:zathura = { + \ 'name' : 'Zathura', + \ 'has_synctex' : 1, + \} + +function! s:zathura.start(outfile) dict abort " {{{1 + let l:cmd = 'zathura' + if self.has_synctex + let l:cmd .= ' -x "' . g:vimtex_compiler_progname + \ . ' --servername ' . v:servername + \ . ' --remote-expr ' + \ . '\"vimtex#view#reverse_goto(%{line}, ''%{input}'')\""' + if g:vimtex_view_forward_search_on_start + let l:cmd .= ' --synctex-forward ' + \ . line('.') + \ . ':' . col('.') + \ . ':' . vimtex#util#shellescape(expand('%:p')) + endif + endif + let l:cmd .= ' ' . g:vimtex_view_zathura_options + let l:cmd .= ' ' . vimtex#util#shellescape(a:outfile) + let self.process = vimtex#process#start(l:cmd) + + call self.xwin_get_id() + let self.outfile = a:outfile +endfunction + +" }}}1 +function! s:zathura.forward_search(outfile) dict abort " {{{1 + if !self.has_synctex | return | endif + if !filereadable(self.synctex()) | return | endif + + let l:cmd = 'zathura --synctex-forward ' + let l:cmd .= line('.') + let l:cmd .= ':' . col('.') + let l:cmd .= ':' . vimtex#util#shellescape(expand('%:p')) + let l:cmd .= ' ' . vimtex#util#shellescape(a:outfile) + call vimtex#process#run(l:cmd) + let self.cmd_forward_search = l:cmd + let self.outfile = a:outfile +endfunction + +" }}}1 +function! s:zathura.compiler_callback(status) dict abort " {{{1 + if !a:status && g:vimtex_view_use_temp_files < 2 + return + endif + + if g:vimtex_view_use_temp_files + call self.copy_files() + endif + + if !filereadable(self.out()) | return | endif + + if g:vimtex_view_automatic + " + " Search for existing window created by latexmk + " It may be necessary to wait some time before it is opened and + " recognized. Sometimes it is very quick, other times it may take + " a second. This way, we don't block longer than necessary. + " + if !has_key(self, 'started_through_callback') + for l:dummy in range(30) + sleep 50m + if self.xwin_exists() | break | endif + endfor + endif + + if !self.xwin_exists() && !has_key(self, 'started_through_callback') + call self.start(self.out()) + let self.started_through_callback = 1 + endif + endif + + if has_key(self, 'hook_callback') + call self.hook_callback() + endif +endfunction + +" }}}1 +function! s:zathura.latexmk_append_argument() dict abort " {{{1 + if g:vimtex_view_use_temp_files + let cmd = ' -view=none' + else + let zathura = 'zathura ' . g:vimtex_view_zathura_options + if self.has_synctex + let zathura .= ' -x \"' . g:vimtex_compiler_progname + \ . ' --servername ' . v:servername + \ . ' --remote +\%{line} \%{input}\" \%S' + endif + + let cmd = vimtex#compiler#latexmk#wrap_option('new_viewer_always', '0') + let cmd .= vimtex#compiler#latexmk#wrap_option('pdf_previewer', zathura) + endif + + return cmd +endfunction + +" }}}1 +function! s:zathura.get_pid() dict abort " {{{1 + " First try to match full output file name + let cmd = 'pgrep -nf "zathura.*' + \ . escape(get(self, 'outfile', self.out()), '~\%.') . '"' + let pid = str2nr(system(cmd)[:-2]) + + " Now try to match correct servername as fallback + if empty(pid) + let cmd = 'pgrep -nf "zathura.+--servername ' . v:servername . '"' + let pid = str2nr(system(cmd)[:-2]) + endif + + return pid +endfunction + +" }}}1 + +endif |