c vim indentation preprocessor-directive

Haga que las directivas de preprocesador vim indent C sean iguales a otras sentencias



indentation preprocessor-directive (2)

Información general

(Nota: lea todo esto hasta el final, porque dediqué un poco de tiempo a organizarlo, asegurándome de abordar cada problema individual que tengo y por qué una solución propuesta no me funciona)

Estoy usando cindent in vim para hacer sangría automáticamente. Funciona muy bien la mayor parte del tiempo. Sin embargo, cindent hace tres cosas malas (en mi opinión) que involucran directivas de preprocesador C (declaraciones que comienzan con un hash (''#'')).

En caso de que sea relevante, uso pestañas para la sangría, y mi .vimrc contiene una filetype indent on .

Lo malo 1

Tan pronto como escribo una directiva de preprocesador, vim la coloca en la columna 1 (la elimina completamente). Por ejemplo, esto es lo que vim hace a mi código cuando lo escribo:

int main(void) { while(1) { /* normal things */ #ifdef DEBUG printDebugInfo(); #endif /* normal things */ } }

Sin embargo, quiero que se vea así :

int main(void) { while(1) { /* normal things */ #ifdef DEBUG printDebugInfo(); #endif /* normal things */ } }

En otras palabras, preferiría que vim trate las directivas de preprocesador como cualquier otra declaración C / C ++.

Cosa mala 2

Cuando uso == en (o [movement]= través de) una línea con una directiva de preprocesador, vim la vuelve a colocar en la columna 1 . (Esto es consistente con Bad Thing 1 pero sigue siendo un problema.)

Cosa mala 3

Si (debido a Bad Thing 1 o 2 o al uso de << ) una directiva de preprocesador termina en la columna 1, se "atasca" allí y no se ve afectada por >> . La única forma de aumentar la sangría es I<Tab> o i<Ctrl-t> . Luego se vuelve "sin atascar" y puedo moverlo con << o >> .

Soluciones fallidas

Una solución sugiere poner set cinkeys-=0# en mi .vimrc . Esto corrige las cosas malas 1 - 3, pero agrega una nueva :

Bad Thing 4 (solo con cinkeys-=0# )

Las directivas de preprocesador en la columna 1 no se ven afectadas por == o [movement]= , lo que significa que todavía no puedo corregir automáticamente su sangría hasta que las sangre manualmente con >> o insertando un carácter de tabulación.

Pregunta

¿Hay una manera de resolver Bad Things 1 - 3 sin introducir Bad Thing 4? ¿Puedo forzar a vim para que trate las líneas que comienzan con ''#'' como sentencias C ordinarias?

(¿O simplemente estoy usando #ifdef s de una manera dañina, y esta es la manera de vim de decirme que me detenga?)

Preferiría no parchear vim y / o recompilar, pero lo haré si tengo que hacerlo.


Solución para Bad Thing 4

set cinoptions+=#1s

Esto sangrará por 1 ancho de turno si usa == o [movement]= . Combinándolo con la opción cinkeys-=0# funcionó para mí.


De la documentación de Vim , bajo cinoptions:

Vim pone una línea en la columna 1 si:

  • Comienza con ''#'' (directivas de preprocesador), si ''cinkeys'' contiene ''#''.
  • Comienza con una etiqueta (una palabra clave seguida de '':'', que no sea "case" y "default") y ''cinoptions'' no contiene una entrada ''L'' con un valor positivo.
  • Cualquier combinación de indentaciones hace que la línea tenga menos de 0 indentaciones.

Por lo tanto, eliminar 0# de cinkeys debería anular ese comportamiento predeterminado. (Esta idea aparece en suficientes lugares en las redes ).

set cinkeys=0{,0},0),:,!^F,o,O,e

Con ese cambio a Cinkeys, esto es lo que obtuve, exactamente lo que estás buscando:

int main(void) { while(1) { /* normal things */ #ifdef DEBUG printDebugInfo(); #endif /* normal things */ } }