4

我正在使用Uncrustify v0.60来格式化我的 C++ 源代码。为了配置 Uncrustify,我使用的是UniversalIndentGUI v1.2.0 rev.1070

Line Splitting optionsUniversalIndentGUI 部分中,我设置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 );

    }
}

该方法声明以 > 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 在逗号处拆分参数列表,现在方法声明以 < 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 StartNl Func Def Start在左括号字符后添加换行符,(但这也会影响长度小于 120 个字符的代码。我不想让以下代码分布在多行中:

int Sum( int a, int b, int c, int d );
4

2 回答 2

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 提出了这个功能。但是,我怀疑我们能否很快看到它实施,因为这个项目的作者似乎要么忙于其他事情,要么对积极开发这个项目不再感兴趣。

于 2013-03-18T02:07:21.317 回答
3

对我来说(使用 Uncrustify 0.63),为了实现你想要的,它可以这样组合:

在函数声明中的“(”之后添加或删除换行符

nl_func_decl_start                       = add

在函数定义中的“(”之后添加或删除换行符

nl_func_def_start                        = add

当只有一个参数时覆盖 nl_func_decl_start。

nl_func_decl_start_single                = remove

当只有一个参数时覆盖 nl_func_def_start。

nl_func_def_start_single                 = remove

在函数声明中的每个 ',' 之后添加或删除换行符

nl_func_decl_args                        = add

在函数定义中的每个“,”之后添加或删除换行符

nl_func_def_args                         = add

在函数声明中的 ')' 之前添加或删除换行符

nl_func_decl_end                         = add

在函数定义中的 ')' 之前添加或删除换行符

nl_func_def_end                          = add

当只有一个参数时覆盖 nl_func_decl_end。

nl_func_decl_end_single                  = remove

当只有一个参数时覆盖 nl_func_def_end。

nl_func_def_end_single                   = remove

精简版(无解释):

nl_func_decl_start                       = add
nl_func_def_start                        = add
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_def_end                          = add
nl_func_decl_end_single                  = remove
nl_func_def_end_single                   = remove
于 2016-07-19T07:31:03.917 回答