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でこれを行うことは可能ですか?

orNewline adding and removingなどのセクションで、左括弧文字の後に改行を追加するオプションを認識していますが、これは 120 文字未満の長さのコードにも影響します。次のコードを複数の行にまたがらせたくありません。Nl Func Decl StartNl Func Def Start(

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"))) {
  // ...
}

これで、前の2つのケースのどちらのケースも適合しないため、どちらかが次の唯一の可能な構成にマージされます。

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"))) {
  // ...
}

最後に、前の2つのケースのどちらのケースも適合しないため、どちらかが最終的な唯一の可能な構成にマージされます。

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

パラメーターが 1 つしかない場合は、nl_func_decl_start をオーバーライドします。

nl_func_decl_start_single                = remove

パラメーターが 1 つしかない場合は、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

パラメーターが 1 つしかない場合は、nl_func_decl_end をオーバーライドします。

nl_func_decl_end_single                  = remove

パラメーターが 1 つしかない場合は、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 に答える