web-dev-qa-db-ja.com

clang形式を使用して4つのスペースを持つC ++クラスを自動インデントする方法は?

プロジェクトのルートディレクトリに次の.clang形式のファイルを取得しました。

---
AlignTrailingComments: true
AllowShortFunctionsOnASingleLine: false
AllowShortIfStatementsOnASingleLine: true
AllowShortLoopsOnASingleLine: true
BreakBeforeBinaryOperators: false
IndentWidth: 4
SortIncludes: false
NamespaceIndentation: All
...

C++ヘッダーでclang-formatを実行すると問題が発生し、クラスは次のように自動インデントされます。

enter image description here

ご覧のとおり、publicおよびprivateのラベルは2つのスペースだけでインデントされています。しかし、私が達成しようとしているのは以下の出力です(インデントは手動で調整されました):

enter image description here

このようにして、コードを折りたたむことは本当に楽しいことになります。

この効果を実現するために.clang形式をどのように調整できますか?それが不可能な場合、この望ましい動作を実現するためにclang形式のソースコードにどのようにパッチを適用しますか?

編集:

AccessModifierOffsetの失敗を試しましたが、値{-2,0,2,4}の例を使用しました:

enter image description here

ご覧のとおり、publicブロック内のステートメントは適切にインデントされていません。

EDIT2:

私は@Henrique Jungソリューションを試しましたが、それが私が望んでいることではありません。その組み合わせを使用すると、結果は次のようなものになります。

enter image description here

ご覧のとおり、関数内のコンテンツは4スペースではなく8スペースインデントされています。これは良くありません。

EDIT3:

数か月前に賞金を差し上げたので、これは間違いなく興味深いので、もう一度やり直します。 clang形式のソースコードについて十分な知識を得たら、試してみますが、残念ながらできません。

28
BPL

私の知る限りでは、clang-formatは、非アクセス修飾子クラスの内容とは異なり、関数の内容をインデントするオプションを提供していません。つまり、次のコードを検討してください。

class A {
  public:
    void foo() {}
}

void bar() {
    int a;
}

このコードでは、「void foo(){}」という行は常に「int a;」と同じ量だけインデントされます。 clang形式による。

使用できるように思われるスタイルに最も近いものは、アクセス修飾子をインデントしないことから得られます。例:

class A {
public:
    void foo() {}
}

void bar() {
    int a;
}

これは、たとえば、WebKit、Mozilla、およびLLVMスタイルによって行われます。これは、次の設定によって実現されます。

IndentWidth: 4
AccessModifierOffset: -4
2
Kimby

AccessModifierOffsetIndentWidthの両方を変更することで、必要な効果を達成できました。基本的に、1つ目は2つ目のオフセットとして使用されるため、。clang-formatを次のように作成すると、必要なものが得られます。

AccessModifierOffset: -4
IndentWidth:     8

AccessModifierOffsetが0の場合、publicキーワードはメンバーと同じレベルのインデントになります。ただし、IndentWidthを変更すると、クラス宣言の外のコードも含めて、すべてのコードが8スペースインデントされます。これはサンプルコードです:

class Foo {
    public:
        Foo();
        virtual ~Foo(); };

int main(int argc, char *argv[]) {
        std::cout << "Hello world" << std::endl;
        return 0;
}
1
Henrique Jung

私は同じ問題に遭遇し、最も速い解決策はclangのデフォルト設定のコピーを作成することです(Preference-> Package Settings-> Clang Formatで見つかります)-> Custom Style-Default)をユーザーのカスタム設定に追加(Preference-> Package Settings-> Clang Format-> カスタムスタイル-ユーザー)の場合は、コメントを外してオプションを変更し、好みに合わせます。例えば:

"ColumnLimit": 119,
// Indent width for line continuations.
"ContinuationIndentWidth": 4,
// The number of columns to use for indentation.
"IndentWidth": 4,
"TabWidth": 4,
"UseTab": "Never"
0
ouxiaogu