formateando constexpr si está en modo c ++

10

Recientemente comencé a usar C ++ 17, que trae constexpr if. Sin embargo, esto arruina c++-modela sangría predeterminada.

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

¿Alguien tampoco

  1. ¿Conoces una alternativa más simple al modo cc?
  2. ¿Sabes cómo puedo solucionar este problema en particular?
topisani
fuente

Respuestas:

6

ACTUALIZACIÓN: Esa versión de prueba previa que puse allí en la pregunta original ( emacs-26.0.90.tar.gz) tenía un error que causaba ciertos bucles infinitos al analizar el búfer, específicamente al usar el <token en contextos determinados, como escribir <como el primer carácter de un búfer vacío en Java o C ++ o después de la palabra clave template. El error se ha corregido en la emacs-26rama, por lo que es lo que debe descargar en su lugar.


Tomó mucho para mí para encontrar la respuesta y aprender a la propiedad personalizar el comportamiento en el idioma elisp pero, una forma de fijación que está diciendo a la cc-modeque constexpres un "nombre de ruido", lo que significa que va a ser tratada como un espacio en blanco y por lo tanto ignorado por el analizador.

Lo que pasa es que en la última versión estable de emacs (25.3), la característica de agregar palabras irrelevantes no se agrega, incluso cuando está en el repositorio desde febrero de 2016, por lo que debe descargar la versión sin lanzamiento.

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

Y luego, por ejemplo al final del .emacsarchivo, agregue:

; Load the mode before-hand to make the symbols visible
(require 'cc-mode)
(custom-set-variables '(c-noise-macro-names '("constexpr")))
Peregring-lk
fuente
Si bien esto es genial, y lo estoy probando ahora, todavía se siente como un truco: ¿hay una mejor manera de agregarlo en esa única posición sintáctica?
topisani
No lo sé, pero esta solución me funciona perfectamente.
Peregring-lk
sí, funciona para mí, con este increíble proyecto , así como el último emacs git
topisani
@topisani Por favor, ¿podría ver esa pregunta si le sucede lo mismo después de instalar la última versión de emacs? emacs.stackexchange.com/q/36423/14016
Peregring-lk