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:
- Los paréntesis a menudo se están convirtiendo en llaves , lo que parece confundir a Emacs.
- Las expresiones Lambda todavía no están bien soportadas
- Declaraciones de funciones de tipo final (no puedo comentar, ya que no las he usado)
- Plantillas Variadic (aunque personalmente, no he tenido ningún problema con ellas hasta ahora)
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.