¿Cómo puedo autoformar / sangrar el código C en vim?


250

Cuando copio código de otro archivo, el formato está mal, así:

fun()
{
for(...)
{
for(...)
{
if(...)
{
}
}
}
}

¿Cómo puedo autoformar este código en vim?


3
Para cualquiera que busque formatear y no solo sangrar el código, la segunda respuesta (la mía) se ocupa de eso. Si solo desea corregir la sangría, la respuesta aceptada es la forma más simple.
Derek

Respuestas:


566

Pruebe las siguientes teclas:

gg=G

Explicación: ggva al principio del archivo, =es un comando para corregir la sangría y Gle dice que realice la operación hasta el final del archivo.


28
esto solo sangra el código. ¿No se puede hacer algo para AUTOFORMAT todo?
N 1.1

77
¿Cuál es la diferencia?
Ton van den Heuvel

3
@Ton van: Vea mi respuesta para la diferencia (No podría haber explicado aquí en los comentarios).
Lazer

2
-1 Esto solo corrige la sangría, no el formateo (que era lo que se pedía).
oligofren

3
@oligofren El ejemplo del OP solo incluyó errores de sangría y él acepta la respuesta, así que supongo que a eso se refería.
Amir Rachum

78

Me gusta usar el programa Artistic Style. Según su sitio web :

Artistic Style es un penetrador, formateador y embellecedor de código fuente para los lenguajes de programación C, C ++, C # y Java.

Se ejecuta en Windows, Linux y Mac. Hará cosas como sangría, reemplazando pestañas con espacios o viceversa, colocando espacios alrededor de las operaciones como desee (convirtiendo if(x<2)a si ( x<2 )así es como le gusta), colocando llaves en la misma línea que las definiciones de función o moviéndolas a línea debajo, etc. Todas las opciones están controladas por parámetros de línea de comando.

Para usarlo en vim, simplemente configure la opción formatprg y luego use el comando gq. Entonces, por ejemplo, tengo en mi .vimrc:

autocmd BufNewFile,BufRead *.cpp set formatprg=astyle\ -T4pb

de modo que cada vez que abro un archivo .cpp, formatprg se configura con las opciones que me gustan. Luego, puedo escribir gg para ir al principio del archivo y gqGformatear todo el archivo de acuerdo con mis estándares. Si solo necesito reformatear una sola función, puedo ir a la parte superior de la función, luego escribir gq][y reformateará solo esa función.

Las opciones que tengo para un estilo -T4pbson solo mis preferencias. Puede consultar sus documentos y cambiar las opciones para que formatee el código como desee.

Aquí hay una demostración. Antes del estilo:

int main(){if(x<2){x=3;}}

float test()
{
if(x<2)
x=3;
}

Después de un estilo (gggqG):

int main()
{
    if (x < 2)
    {
        x = 3;
    }
}

float test()
{
    if (x < 2)
        x = 3;
}

Espero que ayude.


3
¿Hay algo como esto para otros formatos; ruby, xml, json, etc.
derGral

1
@Ryan verifique vim-autoformat, vea la respuesta a continuación. Por cierto vim-autoformat también utiliza un estilo entre otros.
Chiel ten Brinke

1
¡Gracias! ¡Estaba empezando a pensar que era la única persona en la palabra que no quería que se abrieran los corchetes en la misma línea que la declaración de función!
user3640967

27

El comando incorporado para sangrar correctamente el código ya se ha mencionado ( gg=G). Si desea embellecer el código, deberá usar una aplicación externa como sangría . Como %denota el archivo actual en modo ex, puede usarlo así:

:!indent %


11

Me parece que clang-formatfunciona bien.

Hay algunos ejemplos de combinaciones de teclas en la documentación de clang

Prefiero usar el equalprgenlace en vim. Esto le permite invocar clang-formatcon G=ggu otras =opciones de sangría.

Simplemente ponga lo siguiente en su archivo .vimrc:

autocmd FileType c,cpp setlocal equalprg=clang-format

3
Necesita instalarlo primero, por ejemplo, para ubuntu 16.04+:sudo apt install clang-format
Eric Wang

3

Quizás pueda intentar lo siguiente $ indent -kr -i8 * .c

Espero que sea útil para ti!


3

Me gusta indentcomo se mencionó anteriormente, pero la mayoría de las veces quiero formatear solo una pequeña sección del archivo en el que estoy trabajando. Como indentpuede tomar código de stdin, es realmente simple:

  1. Seleccione el bloque de código con el que desea formatear Vo similar.
  2. Formatear escribiendo :!indent.

astyle también toma stdin, por lo que puedes usar el mismo truco allí.


2

Quería agregar que, para evitar que se estropee en primer lugar, puede escribir :set pasteantes de pegar. Después de pegar, puede escribir :set nopastepara que cosas como js-beautify y sangría funcionen nuevamente.


1
Lo uso :set paste!para esto, que alterna el valor de pegar en lugar de configurarlo. Esto hace que sea más fácil apagarlo, ya que puede simplemente retroceder algunos comandos y presionar enter.
a'r

0

Su es una herramienta llamada indent. Puede descargarlo y apt-get install indentluego ejecutarlo indent my_program.c.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.