" vimtex - LaTeX plugin for Vim " " Maintainer: Karl Yngve LervÄg " Email: karl.yngve@gmail.com " if exists('b:did_indent') finish endif let b:did_indent = 1 call vimtex#util#set_default('g:vimtex_indent_enabled', 1) if !g:vimtex_indent_enabled | finish | endif let s:cpo_save = &cpo set cpo&vim setlocal autoindent setlocal indentexpr=VimtexIndent() setlocal indentkeys& setlocal indentkeys+=[,(,{,),},],\&,=item function! VimtexIndent() " {{{1 " Find a non-blank non-comment line above the current line let lnum = prevnonblank(v:lnum - 1) while lnum != 0 && getline(lnum) =~# '^\s*%' let lnum = prevnonblank(lnum - 1) endwhile " Zero indent for top of file if lnum == 0 return 0 endif " Get current and previous line, remove comments let cline = substitute(getline(v:lnum), '\\\@= 0 \ ? [s:delimiters_open_math, s:delimiters_close_math] \ : [s:delimiters_open_tex, s:delimiters_close_tex] let popen = s:count_delimiters(pline, l:delimiters[0]) let copen = s:count_delimiters(cline, l:delimiters[0]) let pclose = s:count_delimiters(pline, l:delimiters[1]) let cclose = s:count_delimiters(cline, l:delimiters[1]) let ind += &sw*(max([popen - pclose, 0]) - max([cclose - copen, 0])) " Indent list items if pline =~# '^\s*\\\(bib\)\?item' let ind += &sw endif if cline =~# '^\s*\\\(bib\)\?item' let ind -= &sw endif " Indent tikz elements if pline =~ s:tikz_commands let ind += &sw let s:tikz_indented += 1 endif if s:tikz_indented > 0 && pline =~# ';' let ind -= &sw let s:tikz_indented -= 1 endif return ind endfunction "}}} function! s:count_delimiters(line, pattern) " {{{1 let sum = 0 let indx = match(a:line, a:pattern) while indx >= 0 let sum += 1 let match = matchstr(a:line, a:pattern, indx) let indx += len(match) let indx = match(a:line, a:pattern, indx) endwhile return sum endfunction " }}}1 " {{{1 Script variables let s:tikz_indented = 0 " Define some common patterns let s:envs_lists = 'itemize\|description\|enumerate\|thebibliography' let s:envs_noindent = 'document\|verbatim\|lstlisting' let s:delimiters_open_tex = '\(' . join([ \ '{', \ '\[', \ '\\(', \ ], '\|') . '\)' let s:delimiters_close_tex = '\(' . join([ \ '}', \ '\]', \ '\\)', \ ], '\|') . '\)' let s:delimiters_open_math = '\(' . join([ \ '\\{', \ '\\\Cleft\s*\%([^\\]\|\\.\|\\\a*\)', \ '\\\cbigg\?\((\|\[\|\\{\)', \ ], '\|') . '\)' let s:delimiters_close_math = '\(' . join([ \ '\\}', \ '\\\Cright\s*\%([^\\]\|\\.\|\\\a*\)', \ '\\\cbigg\?\()\|\]\|\\}\)', \ ], '\|') . '\)' let s:tikz_commands = '\\\(' . join([ \ 'draw', \ 'fill', \ 'path', \ 'node', \ 'add\(legendentry\|plot\)', \ ], '\|') . '\)' " }}}1 let &cpo = s:cpo_save unlet s:cpo_save " vim: fdm=marker sw=2