21

基本信息

(注意:请通读本文,因为我花了一些时间整理它,确保我解决了我遇到的每一个问题以及为什么一个建议的解决方案对我不起作用。)

我在 vim 中使用 cindent 自动进行缩进。它大部分时间都很好用。然而,cindent 做了三件坏事(在我看来)涉及 C 预处理器指令(以哈希 ('#') 开头的语句)。

如果它是相关的,我使用制表符进行缩进,我的 .vimrc 包含filetype indent on.

坏事 1

一旦我输入一个预处理器指令,vim 就会把它放在第 1 列(它完全取消缩进)。例如,当我键入代码时,vim 会对我的代码执行以下操作:

int main(void)
{
    while(1) {
        /* normal things */
#ifdef DEBUG
        printDebugInfo();
#endif
        /* normal things */
    }
}

但是,我希望它看起来像这样

int main(void)
{
    while(1) {
        /* normal things */
        #ifdef DEBUG
        printDebugInfo();
        #endif
        /* normal things */
    }
}

换句话说,我更喜欢 vim 像对待任何其他 C/C++ 语句一样对待预处理器指令。

坏事 2

当我在带有预处理器指令的行==上(或跨行)使用时, vim 将其放回第 1 列。(这与坏事 1 一致,但仍然是一个问题。)[movement]=

坏事 3

如果(由于 Bad Thing 1 或 2 或使用<<)预处理器指令最终出现在第 1 列中,它就会“卡在”那里并且不受>>. 增加缩进的唯一方法是I<Tab>i<Ctrl-t>。然后它变得“不卡住”,我可以用<<or移动它>>

失败的解决方案

一种解决方案建议放入set cinkeys-=0#我的.vimrc. 这修复了Bad Things 1 - 3,但添加了一个新的

坏事 4(仅限cinkeys-=0#

第 1 列中的预处理器指令不受==or影响[movement]=,这意味着我仍然无法自动修复它们的缩进,直到我使用>>或插入制表符手动缩进它们。

问题

有没有办法在不引入坏事 4 的情况下解决坏事 1-3?我可以强制 vim 像普通 C 语句一样处理以 '#' 开头的行吗?

(或者我只是#ifdef以有害的方式使用 s,这是 vim 告诉我停止的方式?)

我不想修补 vim 和/或重新编译,但如果我必须这样做的话。

4

2 回答 2

7

来自Vim 文档,在 cinoptions 下:

如果出现以下情况,Vim 会在第 1 列放置一行:

  • 如果“cinkeys”包含“#”,则它以“#”(预处理器指令)开头。
  • 它以标签开头(关键字后跟“:”,“case”和“default”除外)并且“cinoptions”不包含具有正值的“L”条目。
  • 缩进的任何组合都会导致行的缩进小于 0。

因此,删除0#fromcinkeys应该覆盖该默认行为。(这个想法出现在互联网上足够多的地方。)

set cinkeys=0{,0},0),:,!^F,o,O,e

随着对 cinkeys 的更改,这就是我得到的,正是您正在寻找的:

int main(void)
{
    while(1) {
        /* normal things */
        #ifdef DEBUG
        printDebugInfo();
        #endif
        /* normal things */
    }
}
于 2013-04-17T01:25:50.830 回答
4

坏事的解决方案 4

set cinoptions+=#1s

如果使用==or ,这将缩进 1 shiftwidth [movement]=。将它与选项结合起来cinkeys-=0#对我有用。

于 2016-08-22T14:34:03.060 回答