summaryrefslogtreecommitdiffstats
path: root/autoload/vimtex/view.vim
blob: bebb7be9757244a37ee11a93791a28608fc3af78 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
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