Modo C ++, confusão indendation
Hoje percebi algo estranho que me incomoda. Aqui está um pequeno exemplo de uma função que escrevi. Estou usando tatu, mas isso não tem importância. Aqui, a indentação parece muito boa.
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);
}
Agora, acho a longa inicialização de E2
e E3
irritante, então faço uma quebra de linha entre os dois para melhor legibilidade. Eu também recuo todo o meu 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);
}
Agora, Emacs recua o flutuador [...] e instrução de retorno à mesma coluna E2
, E3
. Este não foi o caso no primeiro exemplo. Na minha mente de leigo, as duas últimas afirmações pertencem à mesma coluna da arma::fvec
afirmação, como no primeiro exemplo.
Existe uma maneira de corrigir isso?
Ainda não consegui encontrar nada específico na internet. Normalmente, estou usando 'stroustrup' no estilo C. Tentei outros estilos sem sucesso.
Edit: Desculpe, esqueci completamente. Estou usando o emacs 25.2.2, uso o helm e uma empresa completa com clang, mas nenhum pacote que eu consiga pensar modifica as indentações.
Edit2: Eu também observei o mesmo comportamento com a opção -Q (emacs -Q), portanto, acho que posso descartar que meus pacotes são a causa.
Edit3: Instalar o emacs 27.1 corrigiu o problema, mas isso me levou a uma pergunta de acompanhamento sobre realce e recuo.
Exemplo 3: Agora, o recuo parece estar correto, mas o realce está desligado (estava antes, mas o problema do recuo era prioritário).
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);
}
No exemplo acima, o Emacs é destacado E2
como uma variável, mas E3
é a cor de texto padrão. Quando eu agora mudar o recuo para Exemplo 4:
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);
}
Você pode ver que o recuo de E2
difere de E3
. Eu acredito que o recuo diferente é resultado do emacs não ser reconhecido E3
como uma variável. Alguém também observou isso?
Aqui está uma captura de tela para ilustração

Respostas
Ok, então entrei em contato com os mantenedores / desenvolvedores do CC-Mode e descobri que isso é bug. Eles também cuidaram disso:https://sourceforge.net/p/cc-mode/mailman/message/37097087/
Na correspondência, você encontra um patch em forma de texto. Para aplicar o patch, copie o texto para um arquivo, por exemplo, patchfile.txt
$ mv patchfile.txt path/to/emacs/share/../lisp/progmodes $ cd path/to/emacs/share/../lisp/progmodes
Se você tiver apenas cc - *. El.gz e .elc, mas nenhum arquivo cc- .el na pasta progmodes, primeiro você terá que extraí-los
$ gunzip cc-*.el
Antes de aplicar o patch, verifique se haveria algum erro
$ patch --dry-run < patchfile.txt
Se a saída for semelhante a esta:
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).
Agora você pode aplicar o patch
$ patch < patchfile.txt
[same output as dry-run]
Durante o patch, os arquivos .orig são criados como backup, caso você precise voltar.
Como última etapa, você terá que compilar os arquivos .el para .elc
$ emacs -Q -batch -f batch-byte-compile cc-*.el
Minha saída:
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.
Agora reinicie o emacs.
Por causa da saída ([...] mais recente do que o compilado por byte [...]). Foi-me pedido para abrir um buffer no emacs no modo cc, digite
M-: c-recognize-bare-brace-inits
<Return>
Se a área de eco exibir "t", tudo deve estar bem. Caso contrário, você pode considerar usar o backup e retornar ao estado inicial.
No entanto, no meu caso o bug foi resolvido desta forma. Eu poderia imaginar que não demorará muito até que a correção também esteja oficialmente no sourceforge, o que tornará essa descrição de correção obsoleta.