Skip to content

Commit 833db84

Browse files
committed
perf: use caching for foldlevels
1 parent 3401dc8 commit 833db84

File tree

1 file changed

+23
-15
lines changed

1 file changed

+23
-15
lines changed

autoload/vimtex/fold.vim

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,18 @@
44
55
"
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
3235
endfunction
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
8486
endfunction
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
9697
endfunction
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 '='
119132
endfunction
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
134146
endfunction
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
151161
endfunction
152-
153-
" }}}1

0 commit comments

Comments
 (0)