在vim中自动折叠#defines

时间:2008-09-23 14:06:56

标签: vim scripting

我使用了相当多的多平台C / C ++代码,由常见的#defines(#if WIN,#if UNIX等)分隔。如果我能让vim在打开文件时自动折叠我目前不感兴趣的部分,那将是很好的。我搜索了vim脚本档案,但我没有找到任何有用的东西。有什么建议?可以开始的地方吗?

5 个答案:

答案 0 :(得分:7)

只需在语法中添加折叠区域即可 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

答案 1 :(得分:2)

要添加@hometoasts答案,您可以将该命令添加为文件的前十行或后十行中的注释,vim将自动将其用于该文件。

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

答案 2 :(得分:0)

Denton添加的快速补充:要将新语法规则与任何C或C ++代码一起使用,请将其添加到$VIMRUNTIME/syntax/c.vimcpp.vim的文件中。 ($VIMRUNTIME是您的本地Vim代码所在的位置:Unix上的~/.vim。)此外,语法定义中startend的值是正则表达式,因此您可以使用^#if^#endif确保它们只匹配行开头的字符串。

答案 3 :(得分:0)

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

这用于定义定义打开和关闭折叠的字符。在这种情况下,打开是“<(”和close is“)>”用你喜欢的任何东西替换它们。

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

希望有所帮助。

答案 4 :(得分:0)

我有一个巨大的代码库,因此有大量的#defines。每个文件都有很多#ifdef 而且大多数时候它们都是嵌套的。我尝试了许多vim脚本,但它们总是如此 曾经用我的代码遇到一些错误。所以最后我把所有的定义都放进去了 一个头文件,并将其包含在我想要使用的文件中并在其上执行gcc 像这样

gcc -E -C -P source.cpp&gt; output.cpp

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