diff options
Diffstat (limited to 'ftplugin/latex-box')
-rw-r--r-- | ftplugin/latex-box/common.vim | 38 | ||||
-rw-r--r-- | ftplugin/latex-box/complete.vim | 3 | ||||
-rw-r--r-- | ftplugin/latex-box/findmain.vim | 10 | ||||
-rw-r--r-- | ftplugin/latex-box/folding.vim | 115 | ||||
-rw-r--r-- | ftplugin/latex-box/latexmk.vim | 35 | ||||
-rw-r--r-- | ftplugin/latex-box/mappings.vim | 6 | ||||
-rw-r--r-- | ftplugin/latex-box/motion.vim | 26 |
7 files changed, 156 insertions, 77 deletions
diff --git a/ftplugin/latex-box/common.vim b/ftplugin/latex-box/common.vim index 72a6ef0f..bf6305cc 100644 --- a/ftplugin/latex-box/common.vim +++ b/ftplugin/latex-box/common.vim @@ -25,8 +25,20 @@ setlocal efm+=%E!\ %m " More info for undefined control sequences setlocal efm+=%Z<argument>\ %m +" More info for some errors +setlocal efm+=%Cl.%l\ %m + " Show or ignore warnings if g:LatexBox_show_warnings + " Parse biblatex warnings + setlocal efm+=%-C(biblatex)%.%#in\ t%.%# + setlocal efm+=%-C(biblatex)%.%#Please\ v%.%# + setlocal efm+=%-C(biblatex)%.%#LaTeX\ a%.%# + setlocal efm+=%-Z(biblatex)%m + + " Parse hyperref warnings + setlocal efm+=%-C(hyperref)%.%#on\ input\ line\ %l. + for w in g:LatexBox_ignore_warnings let warning = escape(substitute(w, '[\,]', '%\\\\&', 'g'), ' ') exe 'setlocal efm+=%-G%.%#'. warning .'%.%#' @@ -44,6 +56,7 @@ endif " Push file to file stack setlocal efm+=%+P**%f +setlocal efm+=%+P**\"%f\" " Ignore unmatched lines setlocal efm+=%-G%.%# @@ -114,8 +127,8 @@ function! LatexBox_GetMainTexFile() endif " 5. borrow the Vim-Latex-Suite method of finding it - if Tex_GetMainFileName() != expand('%:p') - let b:main_tex_file = Tex_GetMainFileName() + if LatexBox_GetMainFileName() != expand('%:p') + let b:main_tex_file = LatexBox_GetMainFileName() return b:main_tex_file endif @@ -127,6 +140,8 @@ endfunction function! s:PromptForMainFile() let saved_dir = getcwd() execute 'cd ' . fnameescape(expand('%:p:h')) + + " Prompt for file let l:file = '' while !filereadable(l:file) let l:file = input('main LaTeX file: ', '', 'file') @@ -135,6 +150,16 @@ function! s:PromptForMainFile() endif endwhile let l:file = fnamemodify(l:file, ':p') + + " Make persistent + let l:persistent = '' + while l:persistent !~ '\v^(y|n)' + let l:persistent = input('make choice persistent? (y, n) ') + if l:persistent == 'y' + call writefile([], l:file . '.latexmain') + endif + endwhile + execute 'cd ' . fnameescape(saved_dir) return l:file endfunction @@ -212,15 +237,16 @@ if !exists('g:LatexBox_viewer') endif endif -function! LatexBox_View() +function! LatexBox_View(...) + let lvargs = join(a:000, ' ') let outfile = LatexBox_GetOutputFile() if !filereadable(outfile) echomsg fnamemodify(outfile, ':.') . ' is not readable' return endif - let cmd = g:LatexBox_viewer . ' ' . shellescape(outfile) + let cmd = g:LatexBox_viewer . ' ' . lvargs . ' ' . shellescape(outfile) if has('win32') - let cmd = '!start /b' . cmd . ' >nul' + let cmd = '!start /b ' . cmd . ' >nul' else let cmd = '!' . cmd . ' &>/dev/null &' endif @@ -230,7 +256,7 @@ function! LatexBox_View() endif endfunction -command! LatexView call LatexBox_View() +command! -nargs=* LatexView call LatexBox_View('<args>') " }}} " In Comment {{{ diff --git a/ftplugin/latex-box/complete.vim b/ftplugin/latex-box/complete.vim index 866ffc3c..458e8d81 100644 --- a/ftplugin/latex-box/complete.vim +++ b/ftplugin/latex-box/complete.vim @@ -328,6 +328,7 @@ function! LatexBox_BibComplete(regexp) let type = printf('%-' . s:type_length . 's', type) let auth = m['author'] == '' ? '' : m['author'][:20] . ' ' let auth = substitute(auth, '\~', ' ', 'g') + let auth = substitute(auth, ',.*\ze', ' et al. ', '') let year = m['year'] == '' ? '' : '(' . m['year'] . ')' let w = { 'word': m['key'], \ 'abbr': type . auth . year, @@ -365,7 +366,7 @@ function! s:ExtractLabels() let curname = strpart( getline( lblline ), lblbegin, nameend - lblbegin - 1 ) " Ignore cref entries (because they are duplicates) - if curname =~ "\@cref\|cref\@" + if curname =~# "@cref$" continue endif diff --git a/ftplugin/latex-box/findmain.vim b/ftplugin/latex-box/findmain.vim index 0b9c404f..622c408f 100644 --- a/ftplugin/latex-box/findmain.vim +++ b/ftplugin/latex-box/findmain.vim @@ -1,4 +1,4 @@ -" Tex_GetMainFileName: gets the name of the main file being compiled. {{{ +" LatexBox_GetMainFileName: gets the name of the main file being compiled. {{{ " Description: returns the full path name of the main file. " This function checks for the existence of a .latexmain file " which might point to the location of a "main" latex file. @@ -13,7 +13,8 @@ " NOTE: From version 1.6 onwards, this function always trims " away the .latexmain part of the file name before applying the " modifier argument. -function! Tex_GetMainFileName(...) +" NOTE: This function is copied from the Latex-Suite project! +function! LatexBox_GetMainFileName(...) if a:0 > 0 let modifier = a:1 else @@ -51,10 +52,7 @@ function! Tex_GetMainFileName(...) let lheadfile = expand('%'.modifier) endif - if lheadfile !~ '\.tex$' - let lheadfile .= '.tex' - endif - exe 'cd '.s:origdir + exe 'cd '.s:origdir " NOTE: The caller of this function needs to escape the file name with " fnameescape() . The reason its not done here is that escaping is not diff --git a/ftplugin/latex-box/folding.vim b/ftplugin/latex-box/folding.vim index badfc137..4fe13bc8 100644 --- a/ftplugin/latex-box/folding.vim +++ b/ftplugin/latex-box/folding.vim @@ -1,29 +1,22 @@ " Folding support for LaTeX + " " Options -" g:LatexBox_Folding - Turn on/off folding -" g:LatexBox_fold_preamble - Turn on/off folding of preamble -" g:LatexBox_fold_parts - Define parts (eq. appendix, frontmatter) to fold -" g:LatexBox_fold_sections - Define section levels to fold -" g:LatexBox_fold_envs - Turn on/off folding of environments +" g:LatexBox_Folding - Turn on/off folding +" g:LatexBox_fold_text - Turn on/off LatexBox fold text function +" g:LatexBox_fold_preamble - Turn on/off folding of preamble +" g:LatexBox_fold_parts - Define parts (eq. appendix, frontmatter) to fold +" g:LatexBox_fold_sections - Define section levels to fold +" g:LatexBox_fold_envs - Turn on/off folding of environments +" g:LatexBox_fold_toc - Turn on/off folding of TOC +" g:LatexBox_fold_toc_levels - Set max TOC fold level " - -" {{{1 Set options -if exists('g:LatexBox_Folding') && g:LatexBox_Folding == 1 - setl foldmethod=expr - setl foldexpr=LatexBox_FoldLevel(v:lnum) - setl foldtext=LatexBox_FoldText() - " - " The foldexpr function returns "=" for most lines, which means it can become - " slow for large files. The following is a hack that is based on this reply to - " a discussion on the Vim Developer list: - " http://permalink.gmane.org/gmane.editors.vim.devel/14100 - " - augroup FastFold - autocmd! - autocmd InsertEnter *.tex setlocal foldmethod=manual - autocmd InsertLeave *.tex setlocal foldmethod=expr - augroup end +" {{{1 Initialize options to default values. +if !exists('g:LatexBox_Folding') + let g:LatexBox_Folding=0 +endif +if !exists('g:LatexBox_fold_text') + let g:LatexBox_fold_text=1 endif if !exists('g:LatexBox_fold_preamble') let g:LatexBox_fold_preamble=1 @@ -57,7 +50,45 @@ endif if !exists('g:LatexBox_fold_toc_levels') let g:LatexBox_fold_toc_levels=1 endif +if !exists('g:LatexBox_fold_automatic') + let g:LatexBox_fold_automatic=1 +endif +" }}}1 +if g:LatexBox_Folding == 0 + finish +endif + +" {{{1 Set folding options for vim +setl foldexpr=LatexBox_FoldLevel(v:lnum) +if g:LatexBox_fold_text == 1 + setl foldtext=LatexBox_FoldText() +endif +if g:LatexBox_fold_automatic == 1 + setl foldmethod=expr + + " + " The foldexpr function returns "=" for most lines, which means it can become + " slow for large files. The following is a hack that is based on this reply to + " a discussion on the Vim Developer list: + " http://permalink.gmane.org/gmane.editors.vim.devel/14100 + " + augroup FastFold + autocmd! + autocmd InsertEnter *.tex setlocal foldmethod=manual + autocmd InsertLeave *.tex setlocal foldmethod=expr + augroup end +else + setl foldmethod=manual +endif + +function! LatexBox_FoldOnDemand() + setl foldmethod=expr + normal! zx + setl foldmethod=manual +endfunction + +command! LatexFold call LatexBox_FoldOnDemand() " {{{1 LatexBox_FoldLevel help functions @@ -137,9 +168,9 @@ function! LatexBox_FoldLevel(lnum) " Fold preamble if g:LatexBox_fold_preamble == 1 - if line =~# '\s*\\documentclass' + if line =~# s:notcomment . s:notbslash . '\s*\\documentclass' return ">1" - elseif line =~# '^\s*\\begin\s*{\s*document\s*}' + elseif line =~# s:notcomment . s:notbslash . '\s*\\begin\s*{\s*document\s*}' return "0" endif endif @@ -247,24 +278,13 @@ function! s:CaptionFrame(line) endif endfunction -" {{{1 LatexBox_FoldText -function! LatexBox_FoldText() - " Initialize +function! LatexBox_FoldText_title() let line = getline(v:foldstart) - let nlines = v:foldend - v:foldstart + 1 - let level = '' let title = 'Not defined' - " Fold level - let level = strpart(repeat('-', v:foldlevel-1) . '*',0,3) - if v:foldlevel > 3 - let level = strpart(level, 1) . v:foldlevel - endif - let level = printf('%-3s', level) - " Preamble if line =~ '\s*\\documentclass' - let title = "Preamble" + return "Preamble" endif " Parts, sections and fakesections @@ -280,11 +300,11 @@ function! LatexBox_FoldText() elseif line =~ '\\appendix' let title = "Appendix" elseif line =~ secpat1 . '.*}' - let title = matchstr(line, secpat1 . '\zs.*\ze}') + let title = matchstr(line, secpat1 . '\zs.\{-}\ze}') elseif line =~ secpat1 let title = matchstr(line, secpat1 . '\zs.*') elseif line =~ secpat2 . '.*\]' - let title = matchstr(line, secpat2 . '\zs.*\ze\]') + let title = matchstr(line, secpat2 . '\zs.\{-}\ze\]') elseif line =~ secpat2 let title = matchstr(line, secpat2 . '\zs.*') elseif line =~ 'Fake' . sections . ':' @@ -330,7 +350,22 @@ function! LatexBox_FoldText() endif endif - let title = strpart(title, 0, 68) + return title +endfunction + +" {{{1 LatexBox_FoldText +function! LatexBox_FoldText() + let nlines = v:foldend - v:foldstart + 1 + let title = strpart(LatexBox_FoldText_title(), 0, 68) + let level = '' + + " Fold level + let level = strpart(repeat('-', v:foldlevel-1) . '*',0,3) + if v:foldlevel > 3 + let level = strpart(level, 1) . v:foldlevel + endif + let level = printf('%-3s', level) + return printf('%-3s %-68s #%5d', level, title, nlines) endfunction diff --git a/ftplugin/latex-box/latexmk.vim b/ftplugin/latex-box/latexmk.vim index dfa55f0e..bb70f83d 100644 --- a/ftplugin/latex-box/latexmk.vim +++ b/ftplugin/latex-box/latexmk.vim @@ -413,23 +413,38 @@ function! LatexBox_LatexErrors(status, ...) if a:status < 0 botright copen else - " Write status message to screen - redraw - if a:status > 0 || len(getqflist())>1 - echomsg 'Compiling to ' . g:LatexBox_output_type . ' ... failed!' - else - echomsg 'Compiling to ' . g:LatexBox_output_type . ' ... success!' - endif - " Only open window when an error/warning is detected - if g:LatexBox_quickfix + if g:LatexBox_quickfix >= 3 + \ ? s:log_contains_error(log) + \ : g:LatexBox_quickfix > 0 belowright cw - if g:LatexBox_quickfix==2 + if g:LatexBox_quickfix == 2 || g:LatexBox_quickfix == 4 wincmd p endif endif + redraw + + " Write status message to screen + if a:status > 0 || len(getqflist())>1 + if s:log_contains_error(log) + let l:status_msg = ' ... failed!' + else + let l:status_msg = ' ... there were warnings!' + endif + else + let l:status_msg = ' ... success!' + endif + echomsg 'Compiling to ' . g:LatexBox_output_type . l:status_msg endif endfunction + +function! s:log_contains_error(file) + let lines = readfile(a:file) + let lines = filter(lines, 'v:val =~ ''^.*:\d\+: ''') + let lines = uniq(map(lines, 'matchstr(v:val, ''^.*\ze:\d\+:'')')) + let lines = filter(lines, 'filereadable(fnameescape(v:val))') + return len(lines) > 0 +endfunction " }}} " LatexmkStatus {{{ diff --git a/ftplugin/latex-box/mappings.vim b/ftplugin/latex-box/mappings.vim index 6ff621c1..648d9b56 100644 --- a/ftplugin/latex-box/mappings.vim +++ b/ftplugin/latex-box/mappings.vim @@ -27,6 +27,12 @@ map <silent> <buffer> <LocalLeader>lt :LatexTOC<CR> map <silent> <buffer> <LocalLeader>lj :LatexLabels<CR> " }}} +" Folding {{{ +if g:LatexBox_Folding == 1 + map <buffer> <LocalLeader>lf :LatexFold<CR> +endif +" }}} + " Jump to match {{{ if !exists('g:LatexBox_loaded_matchparen') nmap <buffer> % <Plug>LatexBox_JumpToMatch diff --git a/ftplugin/latex-box/motion.vim b/ftplugin/latex-box/motion.vim index 04275aca..41605aea 100644 --- a/ftplugin/latex-box/motion.vim +++ b/ftplugin/latex-box/motion.vim @@ -345,24 +345,22 @@ function! s:ReadTOC(auxfile, texfile, ...) endif " parse section number let secnum = '' - if len(tree[1]) > 3 && empty(tree[1][1]) - call remove(tree[1], 1) + let tree = tree[1] + if len(tree) > 3 && empty(tree[1]) + call remove(tree, 1) endif - if len(tree[1]) > 1 && tree[1][0] =~ '\(numberline\|tocsection\)' - if !empty(tree[1][1]) - let secnum = LatexBox_TreeToTex(tree[1][1]) - let secnum = substitute(secnum, '\\\S\+\s', '', 'g') - let secnum = substitute(secnum, '\\\S\+{\(.\{-}\)}', '\1', 'g') - let secnum = substitute(secnum, '^{\+\|}\+$', '', 'g') - endif - let tree = tree[1][2:] - else - let tree = tree[1] + if len(tree) > 1 && tree[0] =~ '^\\\(numberline\|tocsection\)' + let secnum = LatexBox_TreeToTex(tree[1]) + let secnum = substitute(secnum, '\\\S\+\s', '', 'g') + let secnum = substitute(secnum, '\\\S\+{\(.\{-}\)}', '\1', 'g') + let secnum = substitute(secnum, '^{\+\|}\+$', '', 'g') + call remove(tree, 1) endif " parse section title let text = LatexBox_TreeToTex(tree) - let text = substitute(text, '^{\+\|}\+$', '', 'g') - let text = substitute(text, '\*', '', 'g') + let text = substitute(text, '^{\+\|}\+$', '', 'g') + let text = substitute(text, '\m^\\\(no\)\?numberline\s*', '', '') + let text = substitute(text, '\*', '', 'g') " add TOC entry call add(fileindices[texfile], len(toc)) |