¿Cómo puedo autoformatear / indentar código C en vim?


Cuando copio código de otro archivo, el formato se estropea, así:

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

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

Author: Jeffrey Bosboom, 0000-00-00

10 answers

Intente las siguientes pulsaciones:

gg=G

Explicación: gg va a la parte superior del archivo, = es un comando para corregir la sangría y G le dice que realice la operación hasta el final del archivo.

 484
Author: Amir Rachum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-18 13:34:48

Me gusta usar el programa de Estilo Artístico. De acuerdo con su sitio web :

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

Se ejecuta en Windows, Linux y Mac. Hará cosas como sangrar, reemplazar pestañas con espacios o viceversa, poner espacios alrededor de las operaciones como quieras (convirtiendo if(x<2) a if ( x<2 ) si así es como te gusta), poner llaves en la misma línea que definiciones de funciones, o moviéndolas a la línea de abajo, etc. Todas las opciones están controladas por parámetros de línea de comandos.

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

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

De modo que cada vez que abro a .archivo cpp, formatprg se establece con las opciones que me gustan. Entonces, puedo escribir gg para ir a la parte superior del archivo, y gqG para formatear el archivo completo de acuerdo con mi estándar. Si solo necesito reformatear una sola función, puedo ir a la parte superior de la función, luego escriba gq][ y reformateará solo esa función.

Las opciones que tengo para astyle, -T4pb, son solo mis preferencias. Puedes revisar sus documentos y cambiar las opciones para que formatee el código como quieras.

Aquí hay una demostración. Antes de astyle:

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

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

Después de astyle (gggqG):

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

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

Espero que ayudar.

 74
Author: Derek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-11 11:53:17

El OP pidió el formateo automático, pero aceptó una respuesta que solo hace sangría automática.

Aquí está la diferencia:

ORIGINAL

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

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

AUTOINDENT

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

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

AUTOFORMATO

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

float test()
{
    if (x < 2)
        x = 3;
}
 51
Author: Lazer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-21 07:46:44

Ya se ha mencionado el comando incorporado para sangrar correctamente el código (gg=G). Si quieres embellecer el código, necesitarás usar una aplicación externa como indent. Dado que % denota el archivo actual en modo ex, puede usarlo de la siguiente manera:

:!indent %
 24
Author: soulmerge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-01 13:04:50

El plugin vim-autoformat le permite formatear su búfer (o selecciones de búfer) con un solo comando: https://github.com/Chiel92/vim-autoformat . Utiliza programas de formato externo para eso, con una alternativa a la funcionalidad de sangría de vim.

 13
Author: Chiel ten Brinke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-06 11:59:43

Encuentro que clang-format funciona bien.

Hay algunos ejemplos de keybindings en la documentación de clang

Prefiero usar el enlace equalprg en vim. Esto le permite invocar clang-format con G=gg u otras opciones de sangría =.

Simplemente ponga lo siguiente en su .archivo vimrc:

autocmd FileType c,cpp setlocal equalprg=clang-format
 7
Author: Daniel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-27 02:34:18

Me gusta indent como 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. Dado que indent puede tomar código de stdin, es realmente simple:

  1. Seleccione el bloque de código que desea formatear con V o similar.
  2. Formato escribiendo :!indent.

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

 3
Author: dsummersl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-13 14:41:41

Tal vez puedas probar los siguientes indent indent-kr-i8*.c

Espero que sea útil para usted!

 2
Author: lattimore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-23 05:59:39

Quería añadir, que con el fin de evitar que sea corrupta, en primer lugar, puede escribir :set paste antes de pegar. Después de pegar, puede escribir :set nopaste para que cosas como js-beautify y sangría vuelvan a funcionar.

 1
Author: atripes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-02 09:01:47

Su es una herramienta llamada indent. Puedes descargarlo con apt-get indent, luego ejecutar indent my_program.c.

 0
Author: n0va_sa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-17 01:24:32