Pregunta Problema de indentación de cc-modo Emacs con C ++ 0x clase enum


Emacs cc-mode aún no parece reconocer el tipo seguro enum class introducido en C ++ 0x. El resultado que obtengo es una doble sangría para segunda, tercera, etc. enumeraciones:

enum class Color {
    Blue,
        Red,
        Orange,
        Green
        };

Lo que me gustaría es:

enum class Color {
    Blue,
    Red,
    Orange,
    Green
};

¿Me puede recomendar un buen comando para agregar a .emacs que hará que el modo cc trate enum class de la misma manera que trata la llanura de edad enum?


32
2018-06-27 18:40


origen


Respuestas:


Este es el problema:

cc-mode se basa en cierto modo en la suposición de que las palabras clave son palabras sueltas. Agregar soporte para enum_class en lugar de enum class solo sería cuestión de cambiar unas pocas expresiones regulares.

En cambio, Emacs lo trata como una clase. La forma correcta de resolver esto sería enseñar a Emacs que esta es una enumeración. Pero eso está más allá del alcance de una respuesta.

Este es el truco:

Así que modificaremos la sangría existente para comportarnos de manera diferente en este caso. (Código disponible para retoques en este esencia.)

(defun dentro-clase-enum-p (pos)
  "Comprueba si POS está entre llaves de C ++ \" clase enum \ "."
  (ignorar errores
    (save-excursion
      (posición goto-char)
      (lista ascendente -1)
      (hacia atrás-sexp 1)
      (mirando hacia atrás "enum [\ t] + clase [\ t] + [^}] +"))))

(defun align-enum-class (langelem)
  (si (inside-class-enum-p (c-langelem-pos langelem))
      0
    (c-lineup-topmost-intro-cont langelem)))

(defun align-enum-class-closing-brace (langelem)
  (si (inside-class-enum-p (c-langelem-pos langelem))
      '-
    '+))

(defun fix-enum-class ()
  "Configuración` c ++ - modo 'para manejar mejor \ "clase enum \". "
  (add-to-list 'c-offsets-alist' (arriba-intro-cont. aline-enum-clase))
  (add-to-list 'c-offsets-alist
               '(instrucción-cont. align-enum-clase-cierre-llave)))

(add-hook 'c ++ - modo-gancho' fix-enum-class)

Esto no está muy probado. ;)

Cómo funciona:

c-offsets-alist determina la sangría para diferentes posiciones en el árbol de sintaxis. Se le pueden asignar constantes o funciones.

Estas dos funciones descubren si la posición actual es dentro el enum class {...}. Si ese es el caso, devuelven 0 o '-, que cc-mode interpreta como una profundidad de sangría. Si no es así, devuelven el valor predeterminado.

inside-class-enum-p simplemente se mueve hasta la llave anterior y verifica si el texto anterior es "clase enum".


26
2017-07-01 16:02