如何在 switch 语句中使用 cinoptons 和 cinkeys 设置正确的缩进?

How to set correct indentation with cinoptons and cinkeys in switch statement?

我正在使用 C++ 的缩进样式,如 LLVM 和 clang 格式。我需要这样的选项:

set cinoptions=:0,g0,(0,Ws,l
set autoindent
set smartindent
set cinkeys=0{,0},0),:,0#,!^F,o,O,e
set cinwords=if,else,while,do,for

问题在于,每当我引用名称空间并按 名称空间: - 它会触发 :0 选项。当按下第二个时: - 它触发回来。是的,一切都是正确的。但总是触发: - 对我的大脑非常不利。我想要静态行为。不是每当我尝试使用一些名称空间并按双:。我只需要为 caseswitch 语句中触发 :0。我希望你能明白我在说什么。请帮忙

switch(number) {
case 4: // i wanna triggering of:0 only for this line of code.
  cout << "Good indentation";
  break;
}
if (true) {
namespace: // NOT FOR THAT!
  namespace:: // triggers back - all is correct. First triggering is very bad!
}

您正在寻找L0;参见 :h cino-L。默认情况下为 -1,这意味着跳转到第 1 列。还值得注意的是文档中的措辞:“如果 N 为非负数,则标签的缩进将是现行缩进减去 N。” -- 这就是 N = 0 起作用的原因。它通过不减去任何东西来保留当前的缩进级别,并通过它避免跳跃。

它只影响 labels 而不是 switch 语句的 case x:。请注意,这意味着如果您希望标签以不同方式缩进,但又不想跳转到 :: 运算符,您可能需要找到支持该类型缩进的 LSP,因为 cino 不支持那。您要么不得不忍受它跳到第一个 : 并返回到 ::,要么没有标签缩进自动不同于您的正常源代码缩进,并且 = 重置任何您对标签缩进所做的手动更改。

无论如何,这也意味着 :0 从未真正被触发过。 cino 的默认选项意味着 L-1namespace: 上触发 - 开关盒标签与普通标签不同,这意味着另一个选项是罪魁祸首。

最后,为了完整起见:

set cinoptions=:0,g0,(0,Ws,l,L0