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

rnmwe5a2  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(172)

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

gpfsuwkq

gpfsuwkq1#

这应该会捕获#if#ifdef#ifndef

function! FoldtextForC()
    " Show the whole #if line
    return getline(v:foldstart)
endfun
set foldtext=FoldtextForC()
set foldmarker=#if,#endif

字符串
在运行:g/#ifdef DEBUG/foldclose关闭一些折叠后,此代码示例将看起来像这样(set foldcolumn=3,所以你可以看到折叠):
x1c 0d1x的数据
您可以调整FoldtextForC以返回更多信息-请参阅:h fold-foldtext

return printf("+%s %s", v:folddashes, getline(v:foldstart))

a5g8bdjr

a5g8bdjr2#

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

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

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

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


您可能还需要考虑使用:

set foldmarker=#if,#endif


因为这将捕获#if defined(...)#ifdef#ifndef#if 0等以及#ifdef
使用语法折叠来实现这一点更具挑战性,因为您必须更改语法规范,因为它不支持将其作为标准。

cygmwpex

cygmwpex3#

您知道可以使用%键导航预处理器条件块吗?
此外,[#和]#向上/向下导航。
因此,您可以转到条件块的开头(可能使用/^# Enter),然后

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

字符串
zd放下折叠。
也许你可以围绕这个概念设计一个小脚本。我不太确定是否会与常规语法折叠有(不利)交互,因为我没有使用它的习惯。我通常使用类似于手动折叠操作的自动折叠。

相关问题