如何防止 clang-format 缩进宏?

How can I prevent clang-format from indenting a macro?

如何防止 clang-format 缩进下面的宏及其赋值?

定义:

#define DESKTOPCHANGE(K,N) \
{MOD, K, changeworkspace, {.i=N}}, \
{MOD | SHIFT, K, sendtoworkspace, {.i=N}},

变成:

#define DESKTOPCHANGE(K, N) \
    {MOD, K, changeworkspace, {.i = N}}, \
        {MOD | SHIFT, K, sendtoworkspace, {.i = N}}

用法:

static key keys[] = {
    DESKTOPCHANGE(XK_1, 0)
    DESKTOPCHANGE(XK_2, 1)
    DESKTOPCHANGE(XK_3, 2)
    DESKTOPCHANGE(XK_4, 3)
    DESKTOPCHANGE(XK_5, 4)};

变成:

static key keys[] = {DESKTOPCHANGE(XK_1, 0) DESKTOPCHANGE(XK_2, 1)
                         DESKTOPCHANGE(XK_3, 2) DESKTOPCHANGE(XK_4, 3)
                             DESKTOPCHANGE(XK_5, 4)}

我尝试了一些 options,但找不到正确的。有没有一种通用的方法可以关闭所有对齐方式,并仅打开如果需要?

这是来自 Github 的 source 代码。我已将其修改为上面代码段中的方式。

三个答案:

  1. 像这样的宏是糟糕的风格,最好修复宏以不包含结尾的逗号。那么您就不必担心 clang-format(或任何其他格式化工具)误解代码。

  2. 使用 clang-format 6.0.0,您可以使用以下方法实现所需的格式:

    BasedOnStyle: WebKit
    ContinuationIndentWidth: 0
    

    或者,如果您不想将格式设置基于 WebKit 样式,这将帮助您完成大部分工作:

    AllowAllParametersOfDeclarationOnNextLine: false
    BinPackParameters: false
    ContinuationIndentWidth: 0
    

    关键是 ContinuationIndentWidth 选项,已记录 here。但是,不幸的是,我不认为你真的想要这个答案,因为设置 ContinuationIndentWidth: 0 可能会使其他代码变得丑陋和不可读。

  3. 如果您已经按照自己的方式设置了代码格式,并且希望禁用 clang-format 影响特定代码块,则可以用 // clang-format on 将其包围和 // clang-format off。有关详细信息,请参阅 documentation