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: 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。
使用 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: 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。