formattando constexpr se in modalità c ++


10

Di recente ho iniziato a utilizzare C ++ 17, che porta constexpr if. Questo tuttavia rovina il c++-moderientro predefinito.

// 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
}

Qualcuno lo fa

  1. Conosci un'alternativa più semplice alla modalità cc?
  2. Sai come posso risolvere questo particolare problema?

Risposte:


6

AGGIORNAMENTO: Quella versione pretest che ho inserito nella domanda originale ( emacs-26.0.90.tar.gz) aveva un bug che <causava alcuni cicli di infinito durante l'analisi del buffer, in particolare quando si utilizza il token in determinati contesti, come la scrittura <come primo carattere di un buffer vuoto in Java o C ++ o dopo la parola chiave template. Il bug è stato corretto nel emacs-26ramo, quindi è quello che devi invece scaricare.


Mi ci è voluto molto per trovare la risposta e imparare come personalizzare la proprietà del comportamento nel linguaggio elisp, ma un modo per risolvere il problema è dire cc-modeche si constexprtratta di un "nome di rumore", il che significa che verrà trattato come uno spazio bianco e quindi ignorato dal parser.

Il fatto è che nell'ultima versione stabile di emacs (25.3), la funzione di aggiunta di parole non rumorose non viene aggiunta, anche quando è nel repository da febbraio 2016, quindi è necessario scaricare una versione non-release.

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 poi, ad esempio alla fine del .emacsfile, aggiungi:

; Load the mode before-hand to make the symbols visible
(require 'cc-mode)
(custom-set-variables '(c-noise-macro-names '("constexpr")))

mentre questo è fantastico, e lo sto provando ora, sembra ancora un hack - c'è un modo migliore per aggiungerlo solo in quella posizione sintattica?
topisani,

Non lo so, ma questa soluzione funziona perfettamente per me.
Peregring-lk,

sì, funziona per me, con questo fantastico progetto e con l'ultimo emacs git
topisani,

@topisani Per favore, potresti vedere questa domanda se ti succede lo stesso dopo aver installato l'ultima versione di emacs? emacs.stackexchange.com/q/36423/14016
Peregring-lk,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.