Vim格式化C++类时自动缩进异常,该现象是否正常?
为什么Vim的
gg=G对类中public后的代码缩进行为不一致? 这其实是Vim默认cindent机制的预期行为,和它对C++类访问修饰符(public/private/protected)的缩进规则有关,我来拆解一下:
背后的逻辑
Vim的cindent模块对类内代码的缩进处理,会根据访问修饰符是否是类块内的第一个非空元素来调整规则:
- 当
public是类里的第一行代码(除了大括号),默认规则会认为这是类成员的起始标记,所以后续的int a;会额外缩进一级,符合你看到的第一个正常场景。 - 但如果类内已经有其他成员(比如你的
int b;),默认的cinoptions配置会把访问修饰符视为和普通成员同级别的元素——它本身和前面的成员保持同一缩进,同时后续的成员也不会再额外缩进,这就是第二个场景里int a;没有缩进的原因。
这是Vim默认代码风格的设计,并非bug,它适配了一部分开发者的编码习惯:认为访问修饰符是类内的"分组标记",和成员处于同一层级,不需要让后续成员再缩进。
如何修改成你想要的缩进风格
如果你希望不管访问修饰符是不是类内第一个元素,后续成员都能额外缩进,可以调整cinoptions的L选项:
- 在Vim中执行命令:
:set cinoptions+=L1 - 再执行
gg=G格式化代码,第二个场景就会变成你预期的样子:class Thing { int b; public: int a; };
L<n>这个选项的作用是指定访问修饰符之后的成员要缩进<n>个shiftwidth宽度,默认值是L0(不额外缩进),改成L1就会让后续成员多缩进一级。如果需要永久生效,可以把这个设置加到你的~/.vimrc文件里。
内容的提问来源于stack exchange,提问作者thingtest
相关产品推荐
相关产品推荐

