5

我使用相当多的多平台 C/C++ 代码,由常见的#defines(#if WIN、#if UNIX 等)分隔。如果我可以让 vim 在我打开文件时自动折叠我当前不感兴趣的部分,那就太好了。我已经搜索了 vim 脚本档案,但没有发现任何有用的东西。有什么建议么?从哪里开始?

4

5 回答 5

8

只需在您的语法中添加一个折叠区域 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
于 2008-09-23T14:19:09.763 回答
2

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

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

于 2008-09-23T14:23:46.600 回答
0

我有一个庞大的代码库和大量的#defines。每个文件都有许多#ifdef,并且大多数时候它们是嵌套的。我尝试了许多 vim 脚本,但它们总是在我的代码中遇到一些错误。所以最后我把我所有的定义放在一个头文件中,并将它包含在我想要使用的文件中,并像这样对它做了一个 gcc

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

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

于 2010-03-04T07:00:49.953 回答
0

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

于 2008-09-23T14:34:16.093 回答
0

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

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

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

希望有帮助。

于 2009-03-23T15:59:50.487 回答