Fandom

Vim Tips Wiki

Folding functions with the prototype included

1,624pages on
this wiki
Add New Page
Talk0 Share

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.

Tip 523 Printable Monobook Previous Next

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()
  {
    ....
  }

CommentsEdit

 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

Also on Fandom

Random Wiki