【问题标题】:Autofold #ifdef..#endif in vim via .vimrc通过 .vimrc 在 vi​​m 中自动折叠 #ifdef..#endif
【发布时间】:2011-06-29 14:41:13
【问题描述】:

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

【问题讨论】:

  • 你用的是什么折叠方法?语法折叠?
  • 是的,语法折叠(但我想我可以,如果这可以简化自动折叠)

标签: vim folding


【解决方案1】:

如果您想要的唯一折叠类型是#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

使用语法折叠执行此操作更具挑战性,因为您必须更改语法规范,因为它不支持此标准。

【讨论】:

  • vim 已经有一个 C 语法折叠,但它不折叠 #x。如何将此添加到自动 C 语法折叠中?
  • *.[ch]{,pp} 模式不适用于 cpp 文件,*.cpp 也不适用于我。当我只使用* 时,它可以工作。知道问题出在哪里吗?
【解决方案2】:

您知道可以使用 % 键导航预处理器条件块吗?

此外,[#]# 向上/向下导航。

所以您可以转到条件块的开头(可能使用 /^#Enter),然后

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

zd 放弃折叠。

也许你可以围绕这个概念设计一个小脚本。我不太确定是否会与常规语法折叠发生(不利)交互,因为我没有使用它的习惯。我通常使用缩进折叠和这样的手动折叠操作。

【讨论】:

    猜你喜欢
    • 2011-03-08
    • 2011-03-20
    • 2010-12-20
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 2021-10-29
    • 2014-04-01
    相关资源
    最近更新 更多