created August 2, 2003 · complexity intermediate · author Matt Perry · version 6.0
The built-in syntax based folding of C/C++ files is good enough for most users, but it will only fold functions from the "{" to the "}". A user may want to fold the prototype as well. Using foldexpr allows this.
function FoldBrace()
if getline(v:lnum+1)[0] == '{'
return '>1'
endif
if getline(v:lnum)[0] == '}'
return '<1'
endif
return foldlevel(v:lnum-1)
endfunction
set foldexpr=FoldBrace()
set foldmethod=expr
Note that this will only work if you put the braces on lines by themselves in the very first column, for example:
void func()
{
....
}
Comments[]
TO DO
- Merge in comments below, it looks like there's an improved version of the script, should test
- Address some shortcomings? This is actually a very difficult problem, Perl syntax tries to do it and fails.
- Maybe use the syntax items in the fold expression for help
Johannes Zellner started to define a fold(ing?) plugin for C and C++. I've tried to enhanced it a little, but unfortunately, it is still imperfect.
See http://hermitte.free.fr/vim/ressources/vimfiles/fold/c-fold.vim
--Luc Hermitte 13:39, 7 June 2007 (UTC), August 2, 2003 18:34
That certainly is more featureful than my version. But I prefer to use foldnestmax=1 - I find it annoying to have more than 1 fold level.
I've modified my fold function to work if the { is on the same line as the function, ie:
void bla() {
}
I'd like to be able to use v:foldstart in my fold function so I can check that the } has the same indent as the line containing the {. That way I could match braces that aren't in the first column. But this is good enough for my purposes.
function FoldBrace()
if getline(v:lnum+1)[0] == '{'
return 1
endif
if getline(v:lnum) =~ '{'
return 1
endif
if getline(v:lnum)[0] =~ '}'
return '<1'
endif
return -1
endfunction