自动翻译#ifdef ..#endif in vim via .vimrc

dcn*_*dcn 8 vim folding

我在互联网上看到了部分解决方案,但没有一个真正让我感到满意:我必须把什么放入我的.vimrc(理想情况下我不想冒任何语法/*.vim文件)这样所有.c/cpp我打开的/ h文件,我自动折叠#ifdef ... #endif部分?

DrA*_*rAl 8

如果您想要的唯一折叠类型是#ifdef部分,最简单的方法是使用以下内容创建文件~/.vim/after/ftplugin/c.vim(您可能还需要执行此操作cpp.vim,我不确定):

set foldmarker=#ifdef,#endif
set foldmethod=marker
Run Code Online (Sandbox Code Playgroud)

如果你真的想把它放在.vimrc而不是使用~/.vim/after/结构,你可以这样做:

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

您可能还想考虑使用:

set foldmarker=#if,#endif
Run Code Online (Sandbox Code Playgroud)

因为这将赶上#if defined(...),#ifdef,#ifndef,#if 0等以及#ifdef.

使用语法折叠执行此操作更具挑战性,因为您必须更改语法规范,因为它不支持此标准.

  • vim已经有一个C语法折叠,但它没有折叠#x.如何将其添加到自动C语法折叠? (2认同)

seh*_*ehe 6

您知道可以使用%密钥导航预处理器条件块吗?

此外,[#]#导航向上/向下.

所以你可以去条件块的开头(也许是/^#Enter),然后

 zf%               -- fold to next conditional directive
 v2]#zf            -- fold to second next directive (e.g. #else... #endif)
Run Code Online (Sandbox Code Playgroud)

zd 放弃折叠.

也许你可以围绕这个概念设计一个小脚本.我不太确定是否会与常规语法折叠进行(不利)交互,因为我不习惯使用它.我通常使用缩进折叠和这样的手动折叠操作.