【问题标题】:Clang-format: How to avoid new line breaksClang 格式:如何避免换行符
【发布时间】:2021-01-04 20:17:44
【问题描述】:

使用 clang-format 我经常遇到如下问题:

// I want this
umbra_map_ops.flags = UMBRA_MAP_CREATE_SHADOW_ON_TOUCH |
                      UMBRA_MAP_SHADOW_SHARED_READONLY;  

// Formatting gives me this
umbra_map_ops.flags =
    UMBRA_MAP_CREATE_SHADOW_ON_TOUCH | UMBRA_MAP_SHADOW_SHARED_READONLY;

// I want this
drmf_status_t status = umbra_read_shadow_memory(
    umbra_map, app, sz, &sz, (byte *)result);    

// Or this
drmf_status_t status = umbra_read_shadow_memory(umbra_map, app, sz, 
                                                &sz, (byte *)result);    

// Formatting gives me this
drmf_status_t status =
    umbra_read_shadow_memory(umbra_map, app, sz, &sz, (byte *)result);

代码看起来很糟糕。如何摆脱这种行为?

Clang format file


更新

现在我正在使用clang-format: off。但我更喜欢不同的东西。

原码:

static bool
ds_mem_init(client_id_t id)
{
    umbra_map_options_t umbra_map_ops;

    umbra_map_ops.scale = UMBRA_MAP_SCALE_SAME_1X;
    umbra_map_ops.flags = UMBRA_MAP_CREATE_SHADOW_ON_TOUCH | /* clang-format: disable */
                          UMBRA_MAP_SHADOW_SHARED_READONLY;  /* clang-format: disable */

    ...
}

static dr_signal_action_t
event_signal_instrumentation(void *drcontext, dr_siginfo_t *info)
{
    bool res = handle_special_shadow_fault(
        drcontext, info->raw_mcontext, info->access_address); /* clang-format: disable */

    return res ? DR_SIGNAL_SUPPRESS : DR_SIGNAL_DELIVER;
}

【问题讨论】:

  • 值得一提的是,不包括设置不等于忽略它。在这种情况下,您只是使用 Webkit 使用的任何东西。您真的应该只导出 Webkit 的文件,然后查看每个设置。其中许多与其他设置有交互。我也没有和你一样的结果。您的最后一个示例符合您指定的 90 列限制,因此它是单行的。与您的按位 OR 相同,它是单行的。
  • 使用您的链接到 clang-format 文件(它应该是问题的一部分),格式化提供了两个一列,您可以在其中抱怨 clang-format 给您的内容。 (我的 WSL2 有 LLVM 7)因为它不一样。如果我将列限制更改为 80,我会得到您显示的结果。请下定决心。
  • @sweenish 这些示例行可能缩进了一些量(在函数内部、内部代码块等)。 OP,您应该提供您想要的确切示例。
  • @Kevin Fair 点。
  • 好的,我已经发布了原始代码。我希望找到快速的解决方案,而不是一一检查所有 WebKit 规则

标签: c++ clang-format


【解决方案1】:

对于第一种情况,您需要:

AlignOperands: Align
PenaltyBreakAssignment: 6

第一个应该是直截了当的;这正是你想要的。第二个是需要调整 clang-format 以不喜欢破坏分配并将右手操作数放在单行上。您可能需要尝试不同的值,因为这与其他惩罚有关。 6 是传递给您的示例代码的最低惩罚。

对于第二种情况,您可以进一步提高惩罚,同时降低相互冲突的惩罚。 “赋值”惩罚似乎适用于此,尽管从技术上讲它不是赋值而是复制初始化:

PenaltyBreakAssignment: 20
PenaltyBreakBeforeFirstCallParameter: 0

不管怎样,至少在我测试的 clang-format 版本中,这些惩罚默认为 2 分配和 19 首次调用参数。

【讨论】:

  • 谢谢,真的很管用!最后,我设置了这些设置:AlignOperands: true 对齐二元运算符,PenaltyBreakAssignment: 50 避免在下一行出现'='
猜你喜欢
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 2018-12-12
相关资源
最近更新 更多