Hi Thore, I've never tried folding like this before, and unfortunately I don't have time to try out this 'optimized' version, but it may work faster for you (I've just replaced the regex matches with stridx and rearranged the code flow):
set foldexpr=GetFoldLevel() function! GetFoldLevel() let line_text = getline(v:lnum) let left_idx = (stridx(line_text, '{') >= 0) let right_idx = (stridx(line_text, '}') >= 0) if left_idx if ! right_idx return 'a1' endif elseif right_idx return 's1' endif return '=' endfunction HTH, Peter --- "Thore B. Karlsen" <[EMAIL PROTECTED]> wrote: > > I use foldmethod=expr with the following foldexpr: > > set foldexpr=GetFoldLevel(v:lnum) > > function! GetFoldLevel(line) > let line_text = getline(a:line) > if (line_text =~ '\%({.*}\)\|\%(}.*{\)') > return '=' > elseif (line_text =~ '{') > return "a1" > elseif (line_text =~ '}') > return "s1" > endif > return '=' > endfunction > > What I want to do is similar to foldmethod=marker with foldmarker={,}, > but if I use foldmethod=marker vim gets confused by lines that contain > both { and } like these: > > string s = String.Format("{0}", v); > string[] sa = new string[] { "a", "b" }; > > GetFoldLevel() above fixes that, in that it keeps the same fold level > if both { and } are found on the same line, but it is horribly slow. > Even in pretty small files (1k lines long), it can take several > seconds for characters to appear when I'm typing in insert mode. > > Is there a way to optimize the above, or an alternative way of doing > this? It is very frustrating to have my folds get out of whack with > foldmethod=marker, but the slowness of this foldexpr is unbearable. > > -- > Be seeing you. > > Send instant messages to your online friends http://au.messenger.yahoo.com