9

I have seen partial solutions over the internet but none that really satisfied me: what do I have to put into my .vimrc (ideally I don't want to chance any syntax/*.vim file) such that in all .c/cpp/h files that I open, I get automatic folding of #ifdef ... #endif sections?

dcn
  • 4,389
  • 2
  • 30
  • 39

2 Answers2

8

If the only type of folding that you want is the #ifdef sections, the easiest way is to create a file ~/.vim/after/ftplugin/c.vim (you may also need to do this in cpp.vim, I'm not sure) with the following content:

set foldmarker=#ifdef,#endif
set foldmethod=marker

If you really want to put it in .vimrc rather than using the ~/.vim/after/ structure, you can do something like this:

autocmd FileType *.[ch]{,pp} call FoldPreprocessor()
function! FoldPreprocessor()
    set foldmarker=#ifdef,#endif
    set foldmethod=marker
endfunction

You might also want to consider using:

set foldmarker=#if,#endif

As that will catch #if defined(...), #ifdef, #ifndef, #if 0 etc as well as #ifdef.

Doing this with syntax folding is more challenging as you'll have to change the syntax specification as it doesn't support this as standard.

DrAl
  • 70,428
  • 10
  • 106
  • 108
  • 2
    vim already has a C syntax folding, but it does not fold the #x. How to add this to the automatic C syntax folding? – orezvani Jan 15 '14 at 00:09
  • The `*.[ch]{,pp}` pattern does not work for me on a `cpp` file, neither does `*.cpp`. When I use just `*` it works. Any idea what the problem is? – oarfish Jan 24 '16 at 12:52
7

You know that you can navigate preprocessor conditional blocks with the % key?

Also, [# and ]# navigate up/down.

So you could go to the start of a conditional block (perhaps with /^#Enter), then

 zf%               -- fold to next conditional directive
 v2]#zf            -- fold to second next directive (e.g. #else... #endif)

zd to drop the fold.

Perhaps you can devise a little script around this concept. I'm not very sure whether there will be (adverse) interaction with the regular syntax folding, since I'm not in the habit of using that. I usually use indent folding with manual fold manipulation like this.

sehe
  • 374,641
  • 47
  • 450
  • 633