c++11 emacs

c++11 - ¿Compatibilidad con la sangría de Emacs para la sintaxis de C++ 11?



(3)

Ahora que C ++ 11 está disponible, me pregunté si hay algún consejo para mejorar el soporte de sangrado en Emacs cuando se migre cada vez más código de C ++ 98 a C ++ 11.

Ejemplos:

Aquí hay algunas frases cuestionables sobre las que me encuentro trabajando:

struct m { int a; char b; }; std::vector<m> foo { {1, ''a''}, {2, ''b''}, { 3, ''c''}, { 4, ''d'' }};

preferiría

std::vector<m> foo { {1, ''a''}, {2, ''b''}, { 3, ''c''}, { 4, ''d'' }};

o incluso

std::vector<m> foo { {1, ''a''}, {2, ''b''}, { 3, ''c''}, { 4, ''d'' }};

por ejemplo.

El proximo:

cout << 5 << [](int a) { return 2 * a; } (5);

preferiría

cout << 5 << [](int a) { return 2 * a; } (5);

De modo que el bloque se sangra con relación a la lambda.

Me encuentro pasando más tiempo en la muesca, lo cual es molesto.

¿Hay algún paquete o personalización que ayude a sangrar el código moderno de C ++ 11?

(nota al margen: configuré el clang-format de Clang para Emacs, pero no puedo obtener una compatibilidad al 100% con el código existente y tampoco comprende muy bien la sintaxis de C ++ 11. Todavía es útil a veces y suena como una buena idea para proyectos nuevos.)


Acabo de instalar manualmente el último Modo CC 5.33 de SourceForge , que debería cubrir la mayor parte de lo que está buscando:

C ++ 11 ahora debería ser totalmente compatible, junto con algunas características de C ++ 14:

  • Inicialización uniforme
  • Funciones lambda
  • Paquetes de parametros
  • Cuerdas crudas
  • Separadores en literales enteros.
  • ">>" como doble plantilla ender
  • etc.

Aquí están las muescas que obtengo por tus ejemplos:

struct m { int a; char b; }; std::vector<m> foo { {1, ''a''}, {2, ''b''}, { 3, ''c''}, { 4, ''d'' }};

y

cout << 5 << [](int a) { return 2 * a; } (5);

También recomiendo instalar modern-c++-font-lock (por ejemplo, a través de MELPA ) como se sugiere en esta respuesta SO .


Cuando estoy usando emacs, la siguiente configuración es lo suficientemente buena para que yo pueda sangrar el código:

; auto indent (setq-default indent-tabs-mode nil) (setq-default tab-width 2) (define-key global-map (kbd "RET") ''newline-and-indent) (defun indent-buffer () (interactive) (save-excursion (indent-region (point-min) (point-max) nil))) (global-set-key [f12] ''indent-buffer)

Espero eso ayude.


Echa un vistazo a ClangFormat :

ClangFormat describe un conjunto de herramientas que están construidas sobre LibFormat. Puede admitir su flujo de trabajo en una variedad de formas, incluida una herramienta independiente y las integraciones de editor.

Está integrado en emacs:

(load "<path-to-clang>/tools/clang-format/clang-format.el") (global-set-key [C-M-tab] ''clang-format-region)

Tiene muchas opciones para definir su estilo de sangría para C ++ 11 y más allá.

Las opciones de estilo de formato Clang describen opciones de estilo de formato configurables compatibles con LibFormat y ClangFormat.

Algunos ejemplos

  • AlignTrailingComments
  • AlwaysBreakTemplateDeclarations
  • etc.