4455"
66
7- function ! vimtex#fold#init_buffer () abort " {{{1
7+ function ! vimtex#fold#init_buffer () abort
88 if ! g: vimtex_fold_enabled
99 \ || s: foldmethod_in_modeline () | return | endif
1010
1111 " Set fold options
1212 setlocal foldmethod = expr
13- setlocal foldexpr = vimtex#fold#level (v: lnum )
13+ setlocal foldexpr = vimtex#fold#level ()
1414 setlocal foldtext = vimtex#fold#text ()
1515
16+ let b: __vimtex_fold_lasttick = -1
17+ let b: __vimtex_fold_cache = []
18+
1619 if g: vimtex_fold_manual
1720 " Remap zx to refresh fold levels
1821 nnoremap <silent> <buffer><nowait> zx :call vimtex#fold#refresh('zx')<cr>
@@ -31,8 +34,7 @@ function! vimtex#fold#init_buffer() abort " {{{1
3134 endif
3235endfunction
3336
34- " }}}1
35- function ! vimtex#fold#init_state (state ) abort " {{{1
37+ function ! vimtex#fold#init_state (state ) abort
3638 "
3739 " Initialize the enabled fold types
3840 "
@@ -83,9 +85,8 @@ function! vimtex#fold#init_state(state) abort " {{{1
8385 endfor
8486endfunction
8587
86- " }}}1
8788
88- function ! vimtex#fold#refresh (map ) abort " {{{1
89+ function ! vimtex#fold#refresh (map ) abort
8990 if &diff
9091 setlocal foldmethod = diff
9192 else
@@ -95,8 +96,20 @@ function! vimtex#fold#refresh(map) abort " {{{1
9596 endif
9697endfunction
9798
98- " }}}1
99- function ! vimtex#fold#level (lnum) abort " {{{1
99+ function ! vimtex#fold#level () abort
100+ if b: __vimtex_fold_lasttick != b: changedtick
101+ let b: __vimtex_fold_lasttick = b: changedtick
102+ let b: __vimtex_fold_cache = []
103+
104+ for l: lnum in range (1 , line (' $' ))
105+ call add (b: __vimtex_fold_cache , s: calculate_fold_level (l: lnum ))
106+ endfor
107+ endif
108+
109+ return b: __vimtex_fold_cache [v: lnum - 1 ]
110+ endfunction
111+
112+ function ! s: calculate_fold_level (lnum) abort
100113 let l: line = getline (a: lnum )
101114 let l: next = getline (a: lnum + 1 )
102115
@@ -118,8 +131,7 @@ function! vimtex#fold#level(lnum) abort " {{{1
118131 return ' ='
119132endfunction
120133
121- " }}}1
122- function ! vimtex#fold#text () abort " {{{1
134+ function ! vimtex#fold#text () abort
123135 let l: line = getline (v: foldstart )
124136 let l: level = v: foldlevel > 1
125137 \ ? repeat (' -' , v: foldlevel- 2 ) . g: vimtex_fold_levelmarker
@@ -133,10 +145,8 @@ function! vimtex#fold#text() abort " {{{1
133145 endfor
134146endfunction
135147
136- " }}}1
137148
138-
139- function ! s: foldmethod_in_modeline () abort " {{{1
149+ function ! s: foldmethod_in_modeline () abort
140150 let l: cursor_pos = vimtex#pos#get_cursor ()
141151 let l: fdm_modeline = ' vim:.*\%(foldmethod\|fdm\)'
142152
@@ -149,5 +159,3 @@ function! s:foldmethod_in_modeline() abort " {{{1
149159 call vimtex#pos#set_cursor (l: cursor_pos )
150160 return l: check_top || l: check_btm
151161endfunction
152-
153- " }}}1
0 commit comments