Autofold #ifdef..#endif in vim via .vimrc

2019-03-20 08:10发布

问题:

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?

回答1:

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.



回答2:

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.



标签: vim folding