web-dev-qa-db-fra.com

Comment indenter automatiquement une classe C++ de 4 espaces en utilisant le format clang?

J'ai le prochain fichier au format .clang dans le répertoire racine de mon projet:

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

Un problème survient lorsque j'exécute le format clang au niveau de mes en-têtes c ++. Les classes s'autoindentent de la manière suivante:

 enter image description here

Comme vous pouvez le constater, les labels public et privé sont en retrait avec seulement 2 espaces. Mais ce que je tente d’obtenir, c’est la sortie ci-dessous (l’indentation a été modifiée manuellement):

 enter image description here

De cette façon, réduire le code devient une tâche vraiment agréable.

Comment pourrais-je modifier mon format .clang pour obtenir cet effet? Si ce n’est pas possible, comment corrigeriez-vous le code source au format Clang pour obtenir ce comportement souhaité?

MODIFIER:

J'ai essayé d'utiliser sans succès AccessModifierOffset, j'ai utilisé l'exemple de valeurs {-2,0,2,4} ci-dessous:

 enter image description here

Comme vous pouvez le constater, la déclaration à l'intérieur du bloc public ne sera pas indentée correctement.

EDIT2:

J'ai essayé la solution @Henrique Jung et ce n'est certainement pas ce que je demande, si vous utilisiez cette combinaison, le résultat serait similaire à celui-ci:

 enter image description here

Et comme vous pouvez le constater, le contenu des fonctions est en retrait de 8 espaces au lieu de 4, ce qui n’est pas satisfaisant.

EDIT3:

J'ai donné une prime il y a quelques mois, je vais donc essayer à nouveau car celle-ci est vraiment intéressante. Si j'avais suffisamment de connaissances sur le code source au format Clang, j'essayerais, mais malheureusement pas.

21
BPL

Autant que je sache, le format clang n'offre aucune option pour indenter le contenu de la fonction différemment du contenu de la classe sans modificateur d'accès. C'est-à-dire, considérez le code suivant:

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

void bar() {
    int a;
}

Dans ce code, la ligne "void foo () {}" sera toujours indentée du même montant que "int a;" par format clang.

La chose la plus proche du style que vous semblez vouloir être disponible viendrait de ne pas indenter les modificateurs d'accès, par exemple:

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

void bar() {
    int a;
}

Cela est fait, par exemple, par les styles WebKit, Mozilla et LLVM. C'est réalisé en mettant:

IndentWidth: 4
AccessModifierOffset: -4
2
Kimby

J'ai rencontré les mêmes problèmes et la solution la plus rapide consiste à créer une copie du paramètre par défaut de Clang (trouvé par Préférence -> Paramètres du package -> Format Clang -> Style personnalisé -Défaut ) dans le paramètre personnalisé de l'utilisateur ( Préférence -> Paramètres du package -> Format de clang -> Style personnalisé - Utilisateur ), puis décommentez et modifiez certaines options dans vos propres préférences. Par exemple:

"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

J'ai réussi à obtenir l'effet souhaité en modifiant à la fois AccessModifierOffset with IndentWidth . Fondamentalement, le premier est utilisé comme un décalage du second, donc si vous créez votre format .clang comme ceci, vous obtenez ce que vous voulez:

AccessModifierOffset: -4
IndentWidth:     8

Si AccessModifierOffset est 0, le mot clé public serait au même niveau d'indentation que les membres. Cependant, changer IndentWidth indentera tout le code de 8 espaces, même ceux en dehors de la déclaration de classe. Ceci est un exemple de code:

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

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