Saltar al contenido

Saltos de línea en formato Clang

Siéntete en la libertad de compartir nuestra página y códigos con otro, danos de tu ayuda para hacer crecer esta comunidad.

Solución:

Entonces, después de jugar con el código de formato clang y hacer algunos parches, aquí están mis dos centavos:

  • El formato Clang se basa en,

    • analizando el AST usando libclangque básicamente elimina todos los espacios en blanco
    • dividir la secuencia del token en “líneas sin envolver” que son como líneas de código “lógicas”
    • Aplicar reglas / información de configuración para dividir a veces “líneas sin envolver” en unidades más pequeñas
    • Escúpelo todo de nuevo con nuevos espacios en blanco / sangría

    No es fácil hacer que respete el espacio en blanco original, que se descarta cuando se analiza el código por primera vez.

  • Puede controlar dónde coloca los saltos de línea, más fácilmente, al

    • establecer el límite de la columna
    • usando las opciones de “parámetros del paquete de contenedores”
    • establecer penalizaciones para varios tipos de rupturas: interrupción después del tipo de retorno de una función, interrupción antes del primer parámetro de llamada, interrupción de un string literal, rompe un comentario…
    • colocar comentarios al final de una línea (el formato clang no puede eliminar el comentario y, por lo tanto, debe dividir la línea)
    • use las directivas off / on de formato clang

Aquí hay una cosa que podrías intentar:

std::vector get_vec()

   return std::vector    //
      "this is a test",                //
      "some of the lines are longer",  //
      "than other, but I would like",  //
      "to keep them on separate lines" //
   ;

La ventaja de esto sobre // clang-format off es que, si luego cambia el ancho de la pestaña o alguna otra opción, esas líneas de código seguirán obteniendo esos cambios de formato, por lo que no necesita ingresar manualmente en el // clang-format off regiones para arreglarlo. Sin embargo, todavía es un truco, YMMV.

Por último, clang-format se trata mucho de imponer un formato uniforme sobre una base de código completa, asegurándose de que todos string los literales tienen el mismo estilo en todas partes de su programa. Si desea tener un control de nivel micro sobre las decisiones de salto de línea, ese no es realmente el espíritu de la herramienta, y tendrá que hacer cosas como deshabilitarla.

Esto a veces puede ser frustrante, especialmente. cuando quiere hacer cosas con matrices y tener columnas alineadas o algo así, por ejemplo, aquí hay un código natural de lua C api:

static luaL_Reg const methods[] = 
    "matches",               &dispatch::intf_match_unit,
    "to_recall",             &dispatch::intf_put_recall_unit,
    "to_map",                &dispatch::intf_put_unit,
    "erase",                 &dispatch::intf_erase_unit,
    "clone",                 intf_copy_unit,
    "extract",               &dispatch::intf_extract_unit,
    "advance",               intf_advance_unit,
;

Cuando el formato clang pasa por encima de eso, generalmente no va a alinear la columna derecha, va a colocarla en un número fijo de espacios después de las comas y no hay mucho que puedas hacer al respecto.

O, si tiene una matriz de 4 x 4 para usar con OpenGL:

      constexpr float shadow_skew_hardcoded[16] =
         1.0f, 0.0f, 0.0f, 0.0f,
          0.5f, 0.5f, 0.0f, 0.0f,
          0.0f, 0.0f, 1.0f, 0.0f,
          0.0f, 0.0f, 0.0f, 1.0f ;

Si permite que el formato clang se ejecute sobre cosas como esta, simplemente las destrozará, y afaik no hay una manera fácil de formatearlas bien, por lo que solo tiene que recurrir al truco de “muchos comentarios triviales” o usar desactiva el formato clang cuando tienes algo como esto. Estas son solo limitaciones intrínsecas de la herramienta. Si no está feliz de tener que hacer cosas así, entonces probablemente no sea la herramienta para usted.

No estoy seguro de que clang-format haga exactamente lo que quiere, pero es posible decirle a clang-format que deje partes del código en paz. Lo uso exactamente para el tipo de escenario del que está hablando, bloques de código donde un formato muy particular hace que sea más fácil de leer.

std::vector get_vec()

   // clang-format off
   return std::vector 
      "this is a test",
      "some of the lines are longer",
      "than other, but I would like",
      "to keep them on separate lines"
   ;
   // clang-format on

Ver: http://clang.llvm.org/docs/ClangFormatStyleOptions.html#disabling-formatting-on-a-piece-of-code

Añadir una coma después de la última string. Esto le dice a clang-format que lo formatee verticalmente. Ej: https://godbolt.org/z/bZxr__ Haga clic derecho> formato de texto

#include 
#include 

std::vector get_vec() 
  return std::vector
      "this is a test",
      "some of the lines are longer",
      "than other, but I would like",
      "to keep them on separate lines", // comma here after last element
  ;


int main()  auto vec = get_vec(); 

Comentarios y valoraciones

Eres capaz de añadir valor a nuestro contenido informacional añadiendo tu experiencia en las reseñas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *