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
|
" VimTeX - LaTeX plugin for Vim
"
" Maintainer: Karl Yngve LervÄg
" Email: karl.yngve@gmail.com
"
function! vimtex#fold#items#new(config) abort " {{{1
return extend(deepcopy(s:folder), a:config).init()
endfunction
" }}}1
let s:folder = {
\ 'name' : 'items',
\ 're' : {},
\ 'state' : [],
\}
function! s:folder.init() dict abort " {{{1
let l:envs = '\{%(' . join(g:vimtex_indent_lists, '|') . ')\*?}'
let self.re.env_start = '\v^\s*\\begin' . l:envs
let self.re.env_end = '\v^\s*\\end' . l:envs
let self.re.fold_re = '^\s*\\item>'
let self.re.fold_re_next = '^\s*\\%(item>|end' . l:envs . ')'
let self.re.start = '\v' . self.re.fold_re
let self.re.end = '\v' . self.re.fold_re_next
return self
endfunction
" }}}1
function! s:folder.level(line, lnum) dict abort " {{{1
let l:env_val = has_key(b:vimtex.fold_types_dict, 'envs')
\ ? b:vimtex.fold_types_dict['envs'].level(a:line, a:lnum)
\ : 0
let l:next = getline(a:lnum + 1)
if a:line =~# self.re.env_start
call add(self.state, {'folded': v:false})
elseif a:line =~# self.re.env_end
call remove(self.state, -1)
if get(self.state, -1, {'folded': v:false}).folded
\ && l:next =~# self.re.end
return 's2'
endif
elseif a:line =~# '\v^\s*\\begin\{'
call add(self.state, {})
elseif len(self.state) > 0
let l:state = self.state[-1]
if a:line =~# '\v^\s*\\end\{' && empty(l:state)
call remove(self.state, -1)
elseif !empty(l:state)
if a:line =~# self.re.start
if l:next !~# self.re.end
let l:state.folded = v:true
return l:env_val is# 'a1' ? 'a2' : 'a1'
endif
elseif l:state.folded && l:next =~# self.re.end
let l:state.folded = v:false
return l:env_val is# 's1' ? 's2' : 's1'
endif
endif
endif
endfunction
" }}}1
function! s:folder.text(line, level) abort dict " {{{1
return a:line
endfunction
" }}}1
|