自动折叠#在Vim中定义

时间:2020-03-06 14:36:02  来源:igfitidea点击:

我使用了大量的多平台C / C ++代码,并用通用的#define(#if WIN,#if UNIX等)分隔。如果我可以让vim在打开文件时自动折叠我当前不感兴趣的部分,那将是很好的。我搜索了vim脚本档案,但没有发现任何有用的信息。有什么建议?开始的地方?

解决方案

只需在语法中添加折叠区域
http://vim.wikia.com/wiki/Syntax_folding_of_Vim_scripts#Syntax_definitions

:syn region myFold start="\#IF" end="\#ENDIF" transparent fold
:syn sync fromstart
:set foldmethod=syntax

要添加到@hometoasts答案,我们可以将该命令作为注释添加到文件的前十行或者后十行,并且vim会自动将其用于该文件。

/* vim: syn region regionName start="regex" end="regex": */

Denton新增内容的快速补充:要对任何C或者C ++代码使用新的语法规则,请将其添加到$ VIMRUNTIME / syntax / c.vim和cpp.vim中的文件中。 ($ VIMRUNTIME是我们本地Vim代码所在的位置:在Unix上为〜/ .vim。)另外,语法定义中的start和end的值是正则表达式,因此可以使用^# if^#endif以确保它们仅与行首的那些字符串匹配。

我一直使用forldmethod = marker并在注释中定义自己的折叠标签。

这是为了定义定义打开和关闭折叠的字符。在这种情况下,open是" <(",close是")>",将它们替换为我们想要的任何内容。

set foldmethod=marker
set foldmarker=<(,)>

这是我的自定义函数,用于决定要显示折叠文本的内容:

set foldtext=GetCustomFoldText()
function GetCustomFoldText()
    let preline = substitute(getline(v:foldstart),'<(','<(+)','')
    let line = substitute(preline,"\t",'        ','g')
    let nextLnNum = v:foldstart + 1
    let nextline = getline(nextLnNum)
    let foldTtl = v:foldend - v:foldstart
    return line .  ' | ' . nextline . ' (' . foldTtl .  ' lines)>'
endfunction

希望能有所帮助。

我有一个庞大的代码库,因此有大量的#define。每个文件都有大量的#ifdef
而且大多数情况下它们是嵌套的。我尝试了许多vim脚本,但它们总是
过去我的代码遇到了一些错误。所以最后我把所有的定义都放进去了
头文件,并将其包含在我要使用的文件中,并对其进行了gcc处理
像这样

gcc -E -C -P source.cpp> output.cpp

-E命令使gcc仅在文件上运行预处理器,因此所有不需要的
未定义的#ifdef中的代码将被删除。
-C选项将注释保留在文件中。
-P选项禁止在预处理器的输出中生成行标记。