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.