我正在使用 Uncrustify v0.60 来格式化我的C ++源代码。为了配置Uncrustify,我使用的是 UniversalIndentGUI v1.2.0 rev.1070 。
在UniversalIndentGUI的Line Splitting options
部分,我将Code Width
设置为120。
假设我有以下示例代码:
namespace MyNameSpace
{
class MyClass
{
public:
std::map< std::string, MyOtherClass* >* ConstructMyOtherClassMap( std::vector< std::string >* allNames, int arg0, double arg1, char arg2 );
}
}
该方法声明以列&gt;结尾。 120,所以Uncrustify返回以下结果:
namespace MyNameSpace
{
class MyClass
{
public:
std::map< std::string, MyOtherClass* >* ConstructMyOtherClassMap( std::vector< std::string >* allNames,
int arg0,
double arg1,
char arg2 );
}
}
正如您所看到的,Uncrustify将逗号分隔参数列表,现在方法声明以列&lt; 120.但是,在这种情况下,我希望Uncrustify将第一个参数放在它自己的行上,如下所示:
namespace MyNameSpace
{
class MyClass
{
public:
std::map< std::string, MyOtherClass* >* ConstructMyOtherClassMap(
std::vector< std::string >* allNames,
int arg0,
double arg1,
char arg2 );
}
}
是否可以使用Uncrustify v0.60执行此操作?
我知道Newline adding and removing
部分中的选项,例如Nl Func Decl Start
或Nl Func Def Start
,在左括号(
字符后添加换行符,但这也会影响代码&LT; 120个字符长。我不希望将以下代码分布在几行中:
int Sum( int a, int b, int c, int d );
答案 0 :(得分:3)
不幸的是,目前Uncrustify的状态是不可能的。因此,您可以做的最好的事情是按以下方式配置您提到的选项:
nl_func_decl_start = ignore
nl_func_def_start = ignore
nl_func_decl_start_single = ignore
nl_func_def_start_single = ignore
ls_func_split_full = true
并在适当的情况下手动包装第一个参数。但是,就个人而言,我认为这不是一个好主意。只需让它自动执行延迟/按需包装。例如,我喜欢上面列出的相同设置,并且在任何可能的情况下仍然具有非常简洁的代码。示例如下。
无包装 - 构造函数参数和构造函数初始化列表都符合最大行长度:
PluginDialog::
PluginDialog(QString const& path, QStringList const& fileNames, QWidget* parent): QDialog(parent), label(new QLabel), treeWidget(new QTreeWidget), okButton(new QPushButton(tr("OK"))) {
// ...
}
现在它们不适合,按照惯例,我们决定首先包装初始化列表:
PluginDialog::
PluginDialog(QString const& path, QStringList const& fileNames, QWidget* parent): QDialog(parent),
label(new QLabel),
treeWidget(new QTreeWidget),
okButton(new QPushButton(tr("OK"))) {
// ...
}
相反的惯例也是可能的:
PluginDialog::
PluginDialog(QString const& path,
QStringList const& fileNames,
QWidget* parent): QDialog(parent), label(new QLabel), treeWidget(new QTreeWidget), okButton(new QPushButton(tr("OK"))) {
// ...
}
现在,前两个案例中的任何一个都不合适,因此它们中的任何一个都合并到下一个且唯一可能的配置中:
PluginDialog::
PluginDialog(QString const& path,
QStringList const& fileNames,
QWidget* parent): QDialog(parent),
label(new QLabel),
treeWidget(new QTreeWidget),
okButton(new QPushButton(tr("OK"))) {
// ...
}
现在我们再次不适合,按照惯例,我们决定在构造函数参数列表列下移动构造函数初始化列表列:
PluginDialog::
PluginDialog(QString const& path,
QStringList const& fileNames,
QWidget* parent):
QDialog(parent),
label(new QLabel),
treeWidget(new QTreeWidget),
okButton(new QPushButton(tr("OK"))) {
// ...
}
顺便说一下我们再次分支案例,也就是说这也是可能的:
PluginDialog::
PluginDialog(
QString const& path,
QStringList const& fileNames,
QWidget* parent): QDialog(parent),
label(new QLabel),
treeWidget(new QTreeWidget),
okButton(new QPushButton(tr("OK"))) {
// ...
}
最后,前两个案例中的任何一个都不合适,因此它们中的任何一个都合并到最终和唯一可能的配置中:
PluginDialog::
PluginDialog(
QString const& path,
QStringList const& fileNames,
QWidget* parent):
QDialog(parent),
label(new QLabel),
treeWidget(new QTreeWidget),
okButton(new QPushButton(tr("OK"))) {
// ...
}
如果Uncrustify提供像Jindent那样的“避免混淆缩进”选项,那将是很棒的。在这种情况下,最后一个片段例如如下所示:
PluginDialog::
PluginDialog(
QString const& path,
QStringList const& fileNames,
QWidget* parent):
QDialog(parent),
label(new QLabel),
treeWidget(new QTreeWidget),
okButton(new QPushButton(tr("OK"))) {
// ...
}
显然更具可读性和赏心悦目。我为Uncrustify提出了这个功能。但是,我怀疑我们可以很快看到它实施,因为这个项目的作者似乎要么忙于其他一些东西,要么对这个项目不再真正感兴趣。
答案 1 :(得分:3)
对我来说(使用Uncrustify 0.63),为了达到你想要的效果,它可以实现这个组合:
在'('在函数声明
中添加或删除换行符BitmapImage
在'('在函数定义
中)之后添加或删除换行符nl_func_decl_start = add
当只有一个参数时,覆盖nl_func_decl_start。
nl_func_def_start = add
当只有一个参数时,覆盖nl_func_def_start。
nl_func_decl_start_single = remove
在函数声明
中的每个','之后添加或删除换行符nl_func_def_start_single = remove
在函数定义
中的每个','之后添加或删除换行符nl_func_decl_args = add
在函数声明
中的')'之前添加或删除换行符nl_func_def_args = add
在函数定义中的')'之前添加或删除换行符
nl_func_decl_end = add
当只有一个参数时,覆盖nl_func_decl_end。
nl_func_def_end = add
当只有一个参数时,覆盖nl_func_def_end。
nl_func_decl_end_single = remove
紧凑版(无解释):
nl_func_def_end_single = remove