Mode C ++, confusion d'indendation

Aug 16 2020

Aujourd'hui, j'ai réalisé quelque chose d'étrange qui me dérange. Voici un petit exemple d'une fonction que j'ai écrite. J'utilise le tatou, mais ce n'est pas important. Ici, l'indentation semble très bien.

float GetE0()
{
    // Calculate E0 according to Kurfess et. al, 2000
    arma::fvec
        E2 {vertex2X - vertex1X, vertex2Y - vertex1Y, vertex2Z - vertex1Z}, E3 {vertex3X - vertex2X, vertex3Y - vertex2Y, vertex3Z - vertex2Z};
    
    float cosPhi2 = norm_dot(E2,E3);
    
    return Kurfess_Eq5(cosPhi2);
}

Maintenant, je trouve la longue initialisation E2et E3ennuyeuse, donc je fais un saut de ligne entre les deux pour une meilleure lisibilité. J'ai également mis en retrait tout mon tampon.

float GetE0()
{
    // Calculate E0 according to Kurfess et. al, 2000
    arma::fvec
        E2 {vertex2X - vertex1X, vertex2Y - vertex1Y, vertex2Z - vertex1Z},
        E3 {vertex3X - vertex2X, vertex3Y - vertex2Y, vertex3Z - vertex2Z};

        float cosPhi2 = norm_dot(E2,E3);

        return Kurfess_Eq5(cosPhi2);
}

Maintenant, le flotteur Emacs indente [...] et la déclaration de retour à la même colonne que E2, E3. Ce n'était pas le cas dans le premier exemple. Dans l'esprit de mon profane, les deux dernières déclarations appartiennent à la même colonne que la arma::fvecdéclaration, comme c'était le cas dans le premier exemple.

Y'a t'il un moyen d'arranger cela?

Je n'ai encore rien trouvé de spécifique sur Internet. Habituellement, j'utilise «stroustrup» de style c. J'ai essayé d'autres styles sans succès.

Edit: Désolé, j'ai complètement oublié. J'utilise emacs 25.2.2, j'utilise helm, et une société complète avec clang mais aucun package auquel je puisse penser ne modifie les indentations.

Edit2: J'ai également observé le même comportement avec l'option -Q (emacs -Q), donc je suppose que je peux exclure que mes paquets soient la cause.

Edit3: L' installation d'emacs 27.1 a résolu le problème, mais cela m'a conduit à une question de suivi concernant la mise en évidence et l'indentation.

Exemple 3: Désormais, l'indentation semble correcte mais la mise en évidence est désactivée (c'était avant, mais le problème d'indentation était prioritaire).

float GetE0()
{
    // Calculate E0 according to Kurfess et. al, 2000
    arma::fvec
        E2 {vertex2X - vertex1X, vertex2Y - vertex1Y, vertex2Z - vertex1Z},
        E3 {vertex3X - vertex2X, vertex3Y - vertex2Y, vertex3Z - vertex2Z};

    float cosPhi2 = norm_dot(E2,E3);
    return Kurfess_Eq5(cosPhi2);
}

Dans l'exemple ci-dessus, Emacs est mis E2en surbrillance comme une variable mais E3est la couleur de texte standard. Quand je change maintenant l'indentation en Example4:

float GetE0()
{
    // Calculate E0 according to Kurfess et. al, 2000
    arma::fvec

         E2 {vertex2X - vertex1X,
         vertex2Y - vertex1Y,
         vertex2Z - vertex1Z},

         E3 {vertex3X - vertex2X,
             vertex3Y - vertex2Y,
             vertex3Z - vertex2Z};

    float cosPhi2 = norm_dot(E2,E3);
    return Kurfess_Eq5(cosPhi2);
}

Vous pouvez voir que l'indentation de E2diffère de E3. Je crois que l'indentation différente est le résultat du fait qu'emacs ne reconnaît pas E3comme une variable. Quelqu'un a-t-il également observé cela?

Voici une capture d'écran pour illustration

Réponses

Andi Aug 31 2020 at 01:08

D'accord, donc je suis entré en contact avec les responsables / développeurs de CC-Mode et il s'est avéré que c'était un bug. Ils s'en sont également occupés:https://sourceforge.net/p/cc-mode/mailman/message/37097087/

Dans la correspondance, vous trouvez un patch sous forme de texte. Pour appliquer le patch, copiez le texte dans un fichier par exemple patchfile.txt

$ mv patchfile.txt path/to/emacs/share/../lisp/progmodes $ cd path/to/emacs/share/../lisp/progmodes

Si vous n'avez que cc - *. El.gz et .elc mais pas de fichiers cc- .el dans le dossier progmodes, vous devrez d'abord les extraire

$ gunzip cc-*.el

Avant d'appliquer le correctif, vérifiez s'il y aurait des erreurs

$ patch --dry-run < patchfile.txt

Si la sortie ressemble à ceci:

Hunk #1 succeeded at 9091 (offset -22 lines).
Hunk #2 succeeded at 9144 (offset -22 lines).
Hunk #3 succeeded at 11731 (offset -29 lines).
checking file cc-langs.el
Hunk #1 succeeded at 3684 (offset -9 lines).

Vous pouvez maintenant appliquer le patch

$ patch < patchfile.txt
[same output as dry-run]

Lors de la correction, les fichiers .orig sont créés en tant que sauvegarde, au cas où vous auriez besoin de revenir en arrière.

Dans une dernière étape, vous devrez compiler les fichiers .el en .elc

$ emacs -Q -batch -f batch-byte-compile cc-*.el

Ma sortie:

Source file ‘/opt/emacs/emacs-27.1-install/share/emacs/27.1/lisp/progmodes/cc-langs.el’ newer than byte-compiled file; using older file

In end of data:
cc-styles.el:687:1:Warning: the function ‘c-guess-basic-syntax’ might not be
    defined at runtime.

Maintenant, redémarrez emacs.

En raison de la sortie ([...] plus récente que la compilation d'octets [...]). On m'a demandé d'ouvrir un tampon dans emacs en mode cc, tapez

M-: c-recognize-bare-brace-inits
<Return>

Si la zone d'écho affiche "t", tout devrait bien se passer. Sinon, vous pouvez envisager d'utiliser la sauvegarde et de revenir à l'état initial.

Néanmoins, dans mon cas, le bogue a été résolu de cette façon. Je pourrais imaginer qu'il ne faudra pas longtemps avant que le correctif soit également officiellement sur sourceforge, ce qui rendra cette description du correctif obsolète.