summaryrefslogtreecommitdiffstats
path: root/autoload/vimtex/view.vim
diff options
context:
space:
mode:
Diffstat (limited to 'autoload/vimtex/view.vim')
-rw-r--r--autoload/vimtex/view.vim115
1 files changed, 115 insertions, 0 deletions
diff --git a/autoload/vimtex/view.vim b/autoload/vimtex/view.vim
new file mode 100644
index 00000000..bebb7be9
--- /dev/null
+++ b/autoload/vimtex/view.vim
@@ -0,0 +1,115 @@
+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#init_buffer() abort " {{{1
+ if !g:vimtex_view_enabled | return | endif
+
+ command! -buffer -nargs=? -complete=file VimtexView
+ \ call b:vimtex.viewer.view(<q-args>)
+ if has_key(b:vimtex.viewer, 'reverse_search')
+ command! -buffer -nargs=* VimtexRSearch
+ \ call b:vimtex.viewer.reverse_search()
+ endif
+
+ nnoremap <buffer> <plug>(vimtex-view)
+ \ :call b:vimtex.viewer.view('')<cr>
+ if has_key(b:vimtex.viewer, 'reverse_search')
+ nnoremap <buffer> <plug>(vimtex-reverse-search)
+ \ :call b:vimtex.viewer.reverse_search()<cr>
+ endif
+endfunction
+
+" }}}1
+function! vimtex#view#init_state(state) abort " {{{1
+ if !g:vimtex_view_enabled | return | endif
+ if has_key(a:state, 'viewer') | return | endif
+
+ try
+ let a:state.viewer = vimtex#view#{g:vimtex_view_method}#new()
+ catch /E117/
+ call vimtex#log#warning(
+ \ 'Invalid viewer: ' . g:vimtex_view_method,
+ \ 'Please see :h g:vimtex_view_method')
+ return
+ endtry
+
+ " Make the following code more concise
+ let l:v = a:state.viewer
+
+ "
+ " Add compiler callback to callback hooks (if it exists)
+ "
+ if exists('*l:v.compiler_callback')
+ \ && index(g:vimtex_compiler_callback_hooks,
+ \ 'b:vimtex.viewer.compiler_callback') == -1
+ call add(g:vimtex_compiler_callback_hooks,
+ \ 'b:vimtex.viewer.compiler_callback')
+ endif
+
+ "
+ " Create view and/or callback hooks (if they exist)
+ "
+ for l:point in ['view', 'callback']
+ execute 'let l:hook = ''g:vimtex_view_'
+ \ . g:vimtex_view_method . '_hook_' . l:point . ''''
+ if exists(l:hook)
+ execute 'let hookfunc = ''*'' . ' . l:hook
+ if exists(hookfunc)
+ execute 'let l:v.hook_' . l:point . ' = function(' . l:hook . ')'
+ endif
+ endif
+ endfor
+endfunction
+
+" }}}1
+
+function! vimtex#view#reverse_goto(line, filename) abort " {{{1
+ if mode() ==# 'i' | stopinsert | endif
+
+ let l:file = resolve(a:filename)
+
+ " Open file if necessary
+ if !bufexists(l:file)
+ if filereadable(l:file)
+ execute 'silent edit' l:file
+ else
+ call vimtex#log#warning("Reverse goto failed for file:\n" . l:file)
+ return
+ endif
+ endif
+
+ " Go to correct buffer and line
+ let l:bufnr = bufnr(l:file)
+ let l:winnr = bufwinnr(l:file)
+ execute l:winnr >= 0
+ \ ? l:winnr . 'wincmd w'
+ \ : 'buffer ' . l:bufnr
+
+ execute 'normal!' a:line . 'G'
+ normal! zMzvzz
+
+ " Attempt to focus Vim
+ if executable('pstree') && executable('xdotool')
+ let l:pids = reverse(split(system('pstree -s -p ' . getpid()), '\D\+'))
+
+ let l:xwinids = []
+ call map(copy(l:pids), 'extend(l:xwinids, reverse(split('
+ \ . "system('xdotool search --onlyvisible --pid ' . v:val)"
+ \ . ')))')
+ call filter(l:xwinids, '!empty(v:val)')
+
+ if !empty(l:xwinids)
+ call system('xdotool windowactivate ' . l:xwinids[0] . ' &')
+ call feedkeys("\<c-l>", 'tn')
+ endif
+ endif
+endfunction
+
+" }}}1
+
+endif