clang-format换行位置异常问题(续篇)
我完全懂你的困扰——就差一点点超过行宽限制,clang-format却非要把返回类型单独拆成一行,而不是按你的预期拆分参数列表,确实很闹心。结合你给出的clang-format配置和版本(10.0.0),咱们来调整几个关键参数解决这个问题。
问题根源
当前配置里的PenaltyReturnTypeOnItsOwnLine: 60这个值太低了,clang-format会认为“把返回类型单独换行”的代价比“拆分参数列表”更小,所以优先选择前者。咱们只要提高这个惩罚值,就能让它尽量避免拆分返回类型,转而优先拆分参数。
具体修改方案
在你的.clang-format配置里,调整以下几个关键参数:
大幅提高返回类型单独换行的惩罚值
把PenaltyReturnTypeOnItsOwnLine从60改成一个更高的数值,比如1000:PenaltyReturnTypeOnItsOwnLine: 1000这个值越高,clang-format就越不愿意把返回类型单独成行,会优先选择拆分参数列表来满足行宽限制。
确保已有正确配置不变
你已经设置了AlwaysBreakAfterReturnType: None,这个选项是对的,要保持不变,它告诉clang-format不要强制在返回类型后换行。
修改后的效果
调整后,之前那个略超120字符的函数声明,会变成你期望的参数拆分格式:
void print_table( std::ofstream &ss, const std::string &title, const std::set<part_reporter_pair> &version_set) const;
而不是讨厌的返回类型单独换行的格式。
额外说明
因为你设置了BinPackParameters: false和AllowAllParametersOfDeclarationOnNextLine: false,clang-format会把每个参数单独放在一行,这正好符合你“优先拆分参数”的需求。如果后续你想让参数尽量紧凑些,可以调整BinPackParameters为true,但当前配置已经满足你的核心需求啦。
内容的提问来源于stack exchange,提问作者code_fodder

