我使用相当多的多平台 C/C++ 代码,由常见的#defines(#if WIN、#if UNIX 等)分隔。如果我可以让 vim 在我打开文件时自动折叠我当前不感兴趣的部分,那就太好了。我已经搜索了 vim 脚本档案,但没有发现任何有用的东西。有什么建议么?从哪里开始?
5 回答
只需在您的语法中添加一个折叠区域 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": */
我有一个庞大的代码库和大量的#defines。每个文件都有许多#ifdef,并且大多数时候它们是嵌套的。我尝试了许多 vim 脚本,但它们总是在我的代码中遇到一些错误。所以最后我把我所有的定义放在一个头文件中,并将它包含在我想要使用的文件中,并像这样对它做了一个 gcc
gcc -E -C -P source.cpp > output.cpp
-E 命令让 gcc 仅在文件上运行预处理器,因此未定义的 #ifdef 中的所有不需要的代码都将被删除。-C 选项保留文件中的注释。-P 选项禁止在预处理器的输出中生成线标记。
对 Denton 的补充的快速补充:要将新语法规则用于任何 C 或 C++ 代码,请将其添加到位于 and 的文件$VIMRUNTIME/syntax/c.vim
中cpp.vim
。($VIMRUNTIME
是本地 Vim 代码所在的位置:~/.vim
在 Unix 上。)此外,语法定义中的start
和值end
是正则表达式,因此您可以使用^#if
并^#endif
确保它们仅匹配行首的那些字符串。
我一直使用 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
希望有帮助。