2017-03-15 3 views
20

J'ai obtenu le fichier suivant .clang format dans le répertoire racine de mon projet:Comment auto indenter une classe C++ avec 4 espaces en utilisant le format clang?

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

problème vient quand je lance clang format sur mon C++ en-têtes, les classes deviennent autoindented comme ceci:

enter image description here

Comme vous pouvez le voir, les étiquettes publiques & privé sont en retrait seulement avec 2 espaces. Mais ce que je suis en train de réaliser est le résultat ci-dessous (indentation a été retouché manuellement):

enter image description here

De cette façon, le code-effondrements devient quelque chose de vraiment agréable à faire.

Comment puis-je modifier mon format .clang pour obtenir cet effet?

EDIT:

J'ai essayé d'utiliser unsuccesfully AccessModifierOffset, j'ai les valeurs utilisées {} -2,0,2,4 exampe ci-dessous:

enter image description here

Comme vous pouvez le voir instruction à l'intérieur du bloc public ne sera pas indentée correctement.

EDIT2:

J'ai essayé la solution @Henrique Jung et c'est certainement pas ce que je demande, si vous utilisez cette combinaison le résultat serait quelque chose comme celui-ci:

enter image description here

Et comme vous pouvez le voir, le contenu à l'intérieur des fonctions est indenté 8 espaces au lieu de 4, ce qui n'est pas bon.

EDIT3:

J'ai donné une prime il y a quelques mois, donc je vais essayer à nouveau que celui-ci est sans aucun doute intéressant. Si j'avais assez de connaissances sur le code source au format clang, je donnerais un coup de feu, malheureusement je ne le fais pas ... J'espère que certains devront jeter un coup d'oeil à celui-ci et donner quelques suggestions.

+0

essayez "AccessModifierOffset". C'est une duplication possible d'une autre question SO: http://stackoverflow.com/questions/29198963/how-can-i-tell-clang-format-to-indent-visibility-modifiers – caoanan

+0

@caoanan Pas vraiment, j'avais déjà essayé AccessModifierOffset il y a quelques jours et pour une raison quelconque, il n'indente pas correctement les classes. Bien qu'il soit vrai qu'il indenter public/privé/protégé, il n'est pas indentant les déclarations ci-dessous. S'il vous plaît jeter un oeil à ma question, je vous ai mis un exemple – BPL

+0

Eh, si seulement je pouvais coller une capture d'écran [dans ce] (http://clang-format.me/). Vous semble avoir les paramètres de style Webkit. –

Répondre

0

j'ai réussi à obtenir l'effet que vous voulez en changeant à la fois AccessModifierOffset avec indentWidth. En gros, le premier est utilisé comme un décalage de la deuxième, donc si vous créez votre comme .clang format ce que vous obtenez ce que vous voulez:

AccessModifierOffset: -4 
IndentWidth:  8 

Si AccessModifierOffset est 0, le mot-clé public serait à le même niveau d'indentation que les membres. Toutefois, la modification 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

Merci pour la réponse, mais ce n'est certainement pas ce que je demande, j'ai édité ma réponse pour expliquer pourquoi ... regardez le std :: cout et retourner 0 déclarations, ils sont en retrait 8 espaces au lieu de 4, je veux 4. – BPL

+0

Oui, je savais qu'il y avait un effet secondaire, mais je ne pouvais pas trouver une variable de retrait spécifique pour les membres. –

1

autant que je peux dire, clang format ne propose aucune option pour indenter le contenu de la fonction différemment des contenus de classe non-accès modificateur.Cela est, considérez le code suivant:

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

void bar() { 
    int a; 
} 

Dans ce code, la ligne "void foo() {}" sera toujours en retrait le même montant que "int a;" par clang-format.

La chose la plus proche du style que vous semblez vouloir qui est disponible proviendrait pas indenter les modificateurs d'accès, par exemple:

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

void bar() { 
    int a; 
} 

Ceci est fait, par exemple, par le WebKit, Mozilla, et LLVM modes. Il est réalisé en réglant:

IndentWidth: 4 
AccessModifierOffset: -4