1*446cb837SBram Moolenaar" Vim filetype plugin file 2*446cb837SBram Moolenaar" Language: PDF 3*446cb837SBram Moolenaar" Maintainer: Tim Pope <[email protected]> 4*446cb837SBram Moolenaar" Last Change: 2007 Dec 16 5*446cb837SBram Moolenaar 6*446cb837SBram Moolenaarif exists("b:did_ftplugin") 7*446cb837SBram Moolenaar finish 8*446cb837SBram Moolenaarendif 9*446cb837SBram Moolenaarlet b:did_ftplugin = 1 10*446cb837SBram Moolenaar 11*446cb837SBram Moolenaarsetlocal commentstring=%%s 12*446cb837SBram Moolenaarsetlocal comments=:% 13*446cb837SBram Moolenaarlet b:undo_ftplugin = "setlocal cms< com< | unlet! b:match_words" 14*446cb837SBram Moolenaar 15*446cb837SBram Moolenaarif exists("g:loaded_matchit") 16*446cb837SBram Moolenaar let b:match_words = '\<\%(\d\+\s\+\d\+\s\+\)obj\>:\<endobj\>,\<stream$:\<endstream\>,\<xref\>:\<trailer\>,<<:>>' 17*446cb837SBram Moolenaarendif 18*446cb837SBram Moolenaar 19*446cb837SBram Moolenaarif exists("g:no_plugin_maps") || exists("g:no_pdf_maps") || v:version < 700 20*446cb837SBram Moolenaar finish 21*446cb837SBram Moolenaarendif 22*446cb837SBram Moolenaar 23*446cb837SBram Moolenaarif !exists("b:pdf_tagstack") 24*446cb837SBram Moolenaar let b:pdf_tagstack = [] 25*446cb837SBram Moolenaarendif 26*446cb837SBram Moolenaar 27*446cb837SBram Moolenaarlet b:undo_ftplugin .= " | silent! nunmap <buffer> <C-]> | silent! nunmap <buffer> <C-T>" 28*446cb837SBram Moolenaarnnoremap <silent><buffer> <C-]> :call <SID>Tag()<CR> 29*446cb837SBram Moolenaar" Inline, so the error from an empty tag stack will be simple. 30*446cb837SBram Moolenaarnnoremap <silent><buffer> <C-T> :if len(b:pdf_tagstack) > 0 <Bar> call setpos('.',remove(b:pdf_tagstack, -1)) <Bar> else <Bar> exe "norm! \<Lt>C-T>" <Bar> endif<CR> 31*446cb837SBram Moolenaar 32*446cb837SBram Moolenaarfunction! s:Tag() 33*446cb837SBram Moolenaar call add(b:pdf_tagstack,getpos('.')) 34*446cb837SBram Moolenaar if getline('.') =~ '^\d\+$' && getline(line('.')-1) == 'startxref' 35*446cb837SBram Moolenaar return s:dodigits(getline('.')) 36*446cb837SBram Moolenaar elseif getline('.') =~ '/Prev\s\+\d\+\>\%(\s\+\d\)\@!' && expand("<cword>") =~ '^\d\+$' 37*446cb837SBram Moolenaar return s:dodigits(expand("<cword>")) 38*446cb837SBram Moolenaar elseif getline('.') =~ '^\d\{10\} \d\{5\} ' 39*446cb837SBram Moolenaar return s:dodigits(matchstr(getline('.'),'^\d\+')) 40*446cb837SBram Moolenaar else 41*446cb837SBram Moolenaar let line = getline(".") 42*446cb837SBram Moolenaar let lastend = 0 43*446cb837SBram Moolenaar let pat = '\<\d\+\s\+\d\+\s\+R\>' 44*446cb837SBram Moolenaar while lastend >= 0 45*446cb837SBram Moolenaar let beg = match(line,'\C'.pat,lastend) 46*446cb837SBram Moolenaar let end = matchend(line,'\C'.pat,lastend) 47*446cb837SBram Moolenaar if beg < col(".") && end >= col(".") 48*446cb837SBram Moolenaar return s:doobject(matchstr(line,'\C'.pat,lastend)) 49*446cb837SBram Moolenaar endif 50*446cb837SBram Moolenaar let lastend = end 51*446cb837SBram Moolenaar endwhile 52*446cb837SBram Moolenaar return s:notag() 53*446cb837SBram Moolenaar endif 54*446cb837SBram Moolenaarendfunction 55*446cb837SBram Moolenaar 56*446cb837SBram Moolenaarfunction! s:doobject(string) 57*446cb837SBram Moolenaar let first = matchstr(a:string,'^\s*\zs\d\+') 58*446cb837SBram Moolenaar let second = matchstr(a:string,'^\s*\d\+\s\+\zs\d\+') 59*446cb837SBram Moolenaar norm! m' 60*446cb837SBram Moolenaar if first != '' && second != '' 61*446cb837SBram Moolenaar let oldline = line('.') 62*446cb837SBram Moolenaar let oldcol = col('.') 63*446cb837SBram Moolenaar 1 64*446cb837SBram Moolenaar if !search('^\s*'.first.'\s\+'.second.'\s\+obj\>') 65*446cb837SBram Moolenaar exe oldline 66*446cb837SBram Moolenaar exe 'norm! '.oldcol.'|' 67*446cb837SBram Moolenaar return s:notag() 68*446cb837SBram Moolenaar endif 69*446cb837SBram Moolenaar endif 70*446cb837SBram Moolenaarendfunction 71*446cb837SBram Moolenaar 72*446cb837SBram Moolenaarfunction! s:dodigits(digits) 73*446cb837SBram Moolenaar let digits = 0 + substitute(a:digits,'^0*','','') 74*446cb837SBram Moolenaar norm! m' 75*446cb837SBram Moolenaar if digits <= 0 76*446cb837SBram Moolenaar norm! 1go 77*446cb837SBram Moolenaar else 78*446cb837SBram Moolenaar " Go one character before the destination and advance. This method 79*446cb837SBram Moolenaar " lands us after a newline rather than before, if that is our target. 80*446cb837SBram Moolenaar exe "goto ".(digits)."|norm! 1 " 81*446cb837SBram Moolenaar endif 82*446cb837SBram Moolenaarendfunction 83*446cb837SBram Moolenaar 84*446cb837SBram Moolenaarfunction! s:notag() 85*446cb837SBram Moolenaar silent! call remove(b:pdf_tagstack,-1) 86*446cb837SBram Moolenaar echohl ErrorMsg 87*446cb837SBram Moolenaar echo "E426: tag not found" 88*446cb837SBram Moolenaar echohl NONE 89*446cb837SBram Moolenaarendfunction 90