Modalità C ++, confusione nell'indicazione
Oggi ho capito qualcosa di strano che mi dà fastidio. Ecco un piccolo esempio di una funzione che ho scritto. Sto usando l'armadillo, ma non è importante. Qui, la rientranza sembra a posto.
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);
}
Ora trovo la lunga inizializzazione di E2
e E3
fastidiosa, quindi faccio un'interruzione di riga tra i due per una migliore leggibilità. Inoltre indento tutto il mio buffer.
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);
}
Ora, Emacs fa rientrare il galleggiante [...] e la dichiarazione ritorno alla stessa colonna E2
, E3
. Questo non era il caso del primo esempio. Nella mente del mio profano, le ultime due affermazioni appartengono alla stessa colonna arma::fvec
dell'affermazione, come nel primo esempio.
C'è un modo per risolvere questo problema?
Non sono ancora riuscito a trovare nulla di specifico su Internet. Di solito utilizzo "stroustrup" in stile c. Ho provato altri stili senza successo.
Modifica: scusa, mi sono completamente dimenticato. Sto usando emacs 25.2.2, uso helm e un'azienda completa di clang ma nessun pacchetto a cui riesco a pensare modifica i rientri.
Edit2: Ho anche osservato lo stesso comportamento con l'opzione -Q (emacs -Q), quindi immagino di poter escludere che i miei pacchetti siano la causa.
Edit3: L' installazione di emacs 27.1 ha risolto il problema, ma questo mi ha portato a una domanda successiva riguardante l'evidenziazione e il rientro.
Esempio 3: ora, il rientro sembra essere corretto ma l'evidenziazione è disattivata (era prima, ma il problema del rientro era prioritario).
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);
}
Nell'esempio sopra, Emacs evidenzia E2
come una variabile ma E3
è il colore del testo standard. Quando ora cambio il rientro in 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);
}
Puoi vedere che il rientro di è E2
diverso da E3
. Credo che il diverso rientro sia il risultato del fatto che emacs non riconosce E3
come variabile. Qualcuno ha notato anche questo?
Qui uno screenshot per l'illustrazione

Risposte
Ok, quindi sono entrato in contatto con i manutentori / sviluppatori di CC-Mode e si è scoperto che questo è un bug. Se ne sono occupati anche loro:https://sourceforge.net/p/cc-mode/mailman/message/37097087/
Nella corrispondenza trovi una toppa in forma di testo. Per applicare la patch, copia il testo in un file, ad esempio patchfile.txt
$ mv patchfile.txt path/to/emacs/share/../lisp/progmodes $ cd path/to/emacs/share/../lisp/progmodes
Se hai solo cc - *. El.gz e .elc ma nessun file cc- .el nella cartella progmodes, dovrai prima estrarli
$ gunzip cc-*.el
Prima di applicare la patch, controlla se ci sarebbero stati errori
$ patch --dry-run < patchfile.txt
Se l'output è simile a questo:
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).
Ora puoi applicare la patch
$ patch < patchfile.txt
[same output as dry-run]
Durante l'applicazione delle patch, i file .orig vengono creati come backup, nel caso in cui sia necessario tornare indietro.
Come ultimo passaggio, dovrai compilare i file .el in .elc
$ emacs -Q -batch -f batch-byte-compile cc-*.el
La mia uscita:
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.
Ora riavvia emacs.
A causa dell'output ([...] più recente di byte-compilato [...]). Mi è stato chiesto di aprire un buffer in emacs in modalità cc, digita
M-: c-recognize-bare-brace-inits
<Return>
Se l'area dell'eco mostra "t" tutto dovrebbe essere a posto. In caso contrario, potresti considerare di utilizzare il backup e tornare allo stato iniziale.
Tuttavia, nel mio caso il bug è stato risolto in questo modo. Potrei immaginare che non ci vorrà molto prima che la correzione sia anche ufficialmente su sourceforge, il che renderà obsoleta questa descrizione della correzione.