Clang 格式:如何避免换行符

Clang-format: How to avoid new line breaks

使用 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;
}

第一种情况,你需要:

AlignOperands: Align
PenaltyBreakAssignment: 6

第一个应该很简单;这正是您想要的。第二个需要调整 clang-format 以不喜欢破坏赋值并将右手操作数放在一行上。您可能需要尝试不同的值,因为这是相对于其他惩罚而言的。 6 是通过您的示例代码的最低惩罚。

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

PenaltyBreakAssignment: 20
PenaltyBreakBeforeFirstCallParameter: 0

至少在我测试的 clang-format 版本中,这些惩罚对于赋值默认为 2,对于首次调用参数默认为 19。