gpt4 book ai didi

c - 使 vim 缩进 C 预处理器指令与其他语句相同

转载 作者:太空狗 更新时间:2023-10-29 16:29:56 26 4
gpt4 key购买 nike

一般信息

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

我在 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

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

坏事 3

如果(因为 Bad Thing 1 或 2 或使用 << )预处理器指令在第 1 列结束,它“卡在”那里并且不受 >> 的影响。增加缩进的唯一方法是 I<Tab>i<Ctrl-t> 。然后它变成“未卡住”,我可以用 <<>> 移动它。

失败的解决方案

One solution 建议将 set cinkeys-=0# 放入我的 .vimrc 中。这修复了坏事 1 - 3,但增加了一个新的:

坏事 4(仅 cinkeys-=0# )

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

问题

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

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

我不想给 vim 打补丁和/或重新编译,但如果必须的话我会的。

最佳答案

来自Vim documentation , 在 cinoptions 下:

Vim puts a line in column 1 if:

  • It starts with '#' (preprocessor directives), if 'cinkeys' contains '#'.
  • It starts with a label (a keyword followed by ':', other than "case" and "default") and 'cinoptions' does not contain an 'L' entry with a positive value.
  • Any combination of indentations causes the line to have less than 0 indentation.

因此,从 cinkeys 中删除 0# 应该会覆盖该默认行为。 (这个想法出现在足够多的地方 on the interwebs 。)

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

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

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

关于c - 使 vim 缩进 C 预处理器指令与其他语句相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16047521/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com