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