web-dev-qa-db-de.com

Wie wird eine C++ - Klasse mit 4 Leerzeichen im Clang-Format automatisch eingerückt?

Ich habe die nächste .clang-Datei im Stammverzeichnis des Projekts erhalten:

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

Problem tritt auf, wenn ich das Clang-Format auf meinen C++ - Headern ausführte. Die Klassen werden wie folgt automatisch erkannt:

 enter image description here

Wie Sie sehen, werden die Labels public & private nur mit 2 Leerzeichen eingerückt. Aber was ich zu erreichen versuche ist die folgende Ausgabe (Einrückung wurde manuell angepasst):

 enter image description here

Auf diese Weise wird Code-Collapsing zu einem wirklich angenehmen Vorgang.

Wie kann ich mein .clang-Format anpassen, um diesen Effekt zu erzielen? Wenn nicht möglich, wie würden Sie den Quellcode im Clang-Format patchen, um dieses gewünschte Verhalten zu erreichen?

BEARBEITEN:

Ich habe versucht, AccessModifierOffset nicht erfolgreich zu verwenden. Ich habe Werte {-2,0,2,4} verwendet. Beispiel:

 enter image description here

Wie Sie sehen, wird die Anweisung im öffentlichen Block nicht richtig eingerückt.

EDIT2:

Ich habe die Lösung von @Henrique Jung ausprobiert und das ist definitiv nicht das, wonach ich frage. Wenn Sie diese Kombination verwenden, wäre das Ergebnis etwa so:

 enter image description here

Und wie Sie sehen können, sind die Inhalte in den Funktionen 8 statt 4 Leerzeichen eingerückt, was nicht gut ist.

EDIT3:

Ich habe vor einigen Monaten ein Kopfgeld gegeben, also werde ich es noch einmal versuchen, da es definitiv interessant ist. Wenn ich genug Wissen über Quellcode im Clang-Format hätte, würde ich es versuchen, leider nicht.

21
BPL

Soweit ich das beurteilen kann, bietet das Clang-Format keine Möglichkeit, Funktionsinhalte anders als Nicht-Access-Modifier-Klasseninhalte einzuziehen. Beachten Sie den folgenden Code:

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

void bar() {
    int a;
}

In diesem Code wird die Zeile "void foo () {}" immer um denselben Betrag wie "int a;" eingerückt. im Clang-Format.

Das, was dem Stil, den Sie anscheinend wünschen, am nächsten kommt, würde kommen, wenn Sie die Zugriffsmodifizierer nicht einrücken, z.

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

void bar() {
    int a;
}

Dies geschieht beispielsweise durch die Stile WebKit, Mozilla und LLVM. Es wird erreicht durch Einstellung:

IndentWidth: 4
AccessModifierOffset: -4
2
Kimby

Ich bin auf die gleichen Probleme gestoßen und finde die schnellste Lösung, eine Kopie der Clang-Standardeinstellung (gefunden durch Preference -> Package Settings -> Clang Format -> Custom Style) zu erstellen -Default ) in die benutzerdefinierte Einstellung des Benutzers ( Preference -> Package Settings -> Clang-Format -> Custom Style - User ), dann kommentieren und einige Optionen ändern nach Ihren Wünschen. Zum Beispiel:

"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

Ich habe es geschafft, den gewünschten Effekt zu erzielen, indem Sie beide AccessModifierOffset mit IndentWidth ändern. Grundsätzlich wird das erste als Offset des zweiten verwendet. Wenn Sie also Ihr .clang-Format so erstellen, erhalten Sie, was Sie möchten:

AccessModifierOffset: -4
IndentWidth:     8

Wenn AccessModifierOffset 0 ist, hat das Schlüsselwort public dieselbe Einrückungsebene wie die Member. Wenn Sie jedoch IndentWidth ändern, wird der gesamte Code um 8 Leerzeichen eingerückt, auch die außerhalb der Klassendeklaration. Dies ist ein Beispielcode:

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

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