tipos resueltos programar funciones ejercicios ejemplos datos como codigos codigo clases basicos c++ indentation auto-indent clang-format

resueltos - ¿Cómo aplicar sangría automática a una clase de C++ con 4 espacios utilizando el formato Clang?



como programar en c++ (3)

Encontré los mismos problemas, y encontrar la solución más rápida es hacer una copia de la configuración predeterminada de clang (encontrada por Preferencia -> Configuración del paquete -> Formato de argot -> Estilo personalizado predeterminado ) en la configuración personalizada del usuario ( Preferencia -> Configuración del paquete -> Formato de Clang -> Estilo personalizado - Usuario ), descomente y modifique algunas opciones según sus preferencias. Por ejemplo:

"ColumnLimit": 119, // Indent width for line continuations. "ContinuationIndentWidth": 4, // The number of columns to use for indentation. "IndentWidth": 4, "TabWidth": 4, "UseTab": "Never"

Obtuve el siguiente archivo de formato .clang en el directorio raíz de mi proyecto:

--- AlignTrailingComments: true AllowShortFunctionsOnASingleLine: false AllowShortIfStatementsOnASingleLine: true AllowShortLoopsOnASingleLine: true BreakBeforeBinaryOperators: false IndentWidth: 4 SortIncludes: false NamespaceIndentation: All ...

El problema viene cuando ejecuto el formato de Clang en mis encabezados de c ++, las clases se autoindentan así:

Como puede ver, las etiquetas public y private están sangradas solo con 2 espacios. Pero lo que estoy tratando de lograr es la siguiente salida (la sangría se modificó manualmente):

De esa manera, el colapso de código se convierte en algo realmente agradable de hacer.

¿Cómo podría modificar mi formato .clang para lograr este efecto? Si no es posible, ¿cómo parchearía el código fuente en formato Clang para lograr el comportamiento deseado?

EDITAR:

He intentado usar AccessModifierOffset sin éxito, he usado el siguiente ejemplo de valores {-2,0,2,4]:

Como se puede ver, la declaración dentro del bloque público no se sangrará correctamente.

EDIT2:

He probado la solución @Henrique Jung y eso definitivamente no es lo que estoy pidiendo, si con esa combinación el resultado sería algo como esto:

Y como puede ver, el contenido dentro de las funciones tiene sangría 8 espacios en lugar de 4, lo cual no es bueno.

EDIT3:

Hace unos meses di una recompensa, así que intentaré nuevamente ya que esta es definitivamente interesante. Si tuviera suficiente conocimiento sobre el código fuente en formato de Clang, le daría una oportunidad, desafortunadamente no lo hago.


Tan cerca de lo que puedo decir, clang-format no ofrece ninguna opción para sangrar los contenidos de las funciones de manera diferente a los contenidos de la clase sin modificador de acceso. Es decir, considere el siguiente código:

class A { public: void foo() {} } void bar() { int a; }

En este código, la línea "void foo () {}" siempre tendrá una sangría igual a la "int a;" por clang-format.

Lo más cercano al estilo que parezca que desea que esté disponible provendría de no sangrar los modificadores de acceso, por ejemplo:

class A { public: void foo() {} } void bar() { int a; }

Esto se hace, por ejemplo, con los estilos WebKit, Mozilla y LLVM. Se logra estableciendo:

IndentWidth: 4 AccessModifierOffset: -4


Logré lograr el efecto que desea al cambiar tanto AccessModifierOffset con IndentWidth . Básicamente, el primero se usa como un desplazamiento del segundo, así que si creas un formato .clang como este, obtendrás lo que deseas:

AccessModifierOffset: -4 IndentWidth: 8

Si AccessModifierOffset es 0, la palabra clave public estaría en el mismo nivel de sangría que los miembros. Sin embargo, el cambio de IndentWidth todo el código en 8 espacios, incluso los que están fuera de la declaración de clase. Este es un código de ejemplo:

class Foo { public: Foo(); virtual ~Foo(); }; int main(int argc, char *argv[]) { std::cout << "Hello world" << std::endl; return 0; }