formatação constexpr se estiver no modo c ++

10

Recentemente, comecei a usar o C ++ 17, que traz constexpr if. No entanto, isso estraga o c++-moderecuo padrão.

// emacs 25.3.2 with --no-init
if constexpr (n == 1) {
    // Why?
  } else if constexpr (n == 2) {
    // This is a mess...
  } else {
  // and it keeps getting weird
}

Alguém quer

  1. Conhece uma alternativa mais simples ao modo cc?
  2. Sabe como posso corrigir esse problema específico?
topisani
fonte

Respostas:

6

UPDATE: Essa versão pré-teste que coloquei na pergunta original ( emacs-26.0.90.tar.gz) tinha um bug que causava certos loops infinitos ao analisar o buffer, especificamente ao usar o <token em certos contextos, como escrever <como o primeiro caractere de um buffer vazio em Java ou C ++ ou após a palavra-chave template. O bug foi corrigido no emacs-26ramo, e é isso que você precisa fazer o download.


Demorou muito para eu encontrar a resposta e aprender como personalizar o comportamento da linguagem elisp, mas uma maneira de corrigir isso é dizer ao cc-modeque constexpré um "nome de ruído", o que significa que será tratado como um espaço em branco e, portanto, ignorado pelo analisador.

O problema é que, na última versão estável do emacs (25.3), o recurso de adicionar palavras de ruído não é adicionado, mesmo quando está no repositório desde fevereiro de 2016, então você precisa fazer o download da versão sem lançamento.

cd tmp_folder_of_your_choice

sudo apt-get install build-essential # if you don't have it yet
sudo apt-get build-dep emacs24 # get all dependancies to build emacs

# Not this: wget https://github.com/emacs-mirror/emacs/archive/emacs-26.0.90.tar.gz

wget -O emacs-26.zip https://github.com/emacs-mirror/emacs/archive/e8636ac8cc96e1e7e948f04091792da09dafcc76.zip

# or just the last version of the branch, but the exact version I have is the one above
# wget https://github.com/emacs-mirror/emacs/archive/emacs-26.zip

unzip emacs-26.zip
cd emacs-emacs-26

./autogen.sh
./configure
make
sudo make install
emacs ~/.emacs

E então, por exemplo, no final do .emacsarquivo, adicione:

; Load the mode before-hand to make the symbols visible
(require 'cc-mode)
(custom-set-variables '(c-noise-macro-names '("constexpr")))
Peregring-lk
fonte
enquanto isso é ótimo, e eu estou testando agora, ainda parece um hack - existe uma maneira melhor de adicioná-lo exatamente nessa posição sintática?
Topisani
Não sei, mas esta solução funciona perfeitamente para mim.
Peregring-lk
sim, ela não funciona para mim, com esse projeto incrível , bem como as últimas emacs git
topisani
@topisani Por favor, você poderia ver essa pergunta se o mesmo acontecer com você depois de instalar a última versão do emacs? emacs.stackexchange.com/q/36423/14016
Peregring-lk