77 lines
2.0 KiB
VimL
77 lines
2.0 KiB
VimL
" vimtex - LaTeX plugin for Vim
|
|
"
|
|
" Maintainer: Karl Yngve Lervåg
|
|
" Email: karl.yngve@gmail.com
|
|
"
|
|
|
|
function! vimtex#debug#stacktrace() " {{{1
|
|
"
|
|
" This function builds on Luc Hermite's answer on Stack Exchange:
|
|
" http://vi.stackexchange.com/a/6024/21
|
|
"
|
|
|
|
"
|
|
" Get stack and exception
|
|
"
|
|
if empty(v:throwpoint)
|
|
try
|
|
throw 'dummy'
|
|
catch
|
|
let l:stack = reverse(split(v:throwpoint, '\.\.'))[1:]
|
|
let l:exception = 'Manual stacktrace'
|
|
endtry
|
|
else
|
|
let l:stack = reverse(split(v:throwpoint, '\.\.'))
|
|
let l:exception = v:exception
|
|
endif
|
|
|
|
"
|
|
" Build the quickfix entries
|
|
"
|
|
let l:qflist = []
|
|
let l:files = {}
|
|
for l:func in l:stack
|
|
let [l:name, l:offset] = (l:func =~# '\S\+\[\d')
|
|
\ ? matchlist(l:func, '\(\S\+\)\[\(\d\+\)\]')[1:2]
|
|
\ : matchlist(l:func, '\(\S\+\), line \(\d\+\)')[1:2]
|
|
|
|
if l:name =~# '\v(\<SNR\>|^)\d+_'
|
|
let l:sid = matchstr(l:name, '\v(\<SNR\>|^)\zs\d+\ze_')
|
|
let l:name = substitute(l:name, '\v(\<SNR\>|^)\d+_', 's:', '')
|
|
let l:filename = map(
|
|
\ vimtex#util#command('scriptnames'),
|
|
\ 'split(v:val, "\\v:=\\s+")[1]')[l:sid-1]
|
|
else
|
|
let l:name = l:name
|
|
let l:filename = matchstr(
|
|
\ vimtex#util#command('verbose function ' . l:name)[1],
|
|
\ '.\{-}\s\+\zs\f\+$')
|
|
endif
|
|
|
|
let l:filename = fnamemodify(l:filename, ':p')
|
|
if filereadable(l:filename)
|
|
if !has_key(l:files, l:filename)
|
|
let l:files[l:filename] = reverse(readfile(l:filename))
|
|
endif
|
|
|
|
let l:lnum = l:offset + len(l:files[l:filename])
|
|
\ - match(l:files[l:filename], '^\s*fu\%[nction]!\=\s\+' . l:name)
|
|
let l:text = len(l:qflist) == 0 ? l:exception : '#' . len(l:qflist)
|
|
|
|
call add(l:qflist, {
|
|
\ 'filename': l:filename,
|
|
\ 'lnum': l:lnum,
|
|
\ 'text': l:text,
|
|
\})
|
|
endif
|
|
endfor
|
|
|
|
call setqflist(l:qflist)
|
|
execute 'copen' len(l:qflist) + 2
|
|
wincmd p
|
|
endfunction
|
|
|
|
" }}}1
|
|
|
|
" vim: fdm=marker sw=2
|