c vim code-formatting

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



code-formatting (10)

Cuando copio el código de otro archivo, el formato se desordena, de esta manera:

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

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


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

Aquí está la diferencia:

ORIGINAL

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

Autoindente

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

AUTO FORMATO

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


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 indent . Ya que % denota el archivo actual en modo ex, puedes usarlo así:

:!indent %


El complemento 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 un retroceso a la funcionalidad de sangría de vim.


Encuentro que clang-format funciona bien.

Hay algunos ejemplos de combinaciones de teclas en la documentación del 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


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.


Me gusta la 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. Ya que la 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, así que puedes usar el mismo truco allí.


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

El estilo artístico es un indentador, 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 sangrar, reemplazar pestañas con espacios o viceversa, colocar espacios alrededor de las operaciones como desee (convertir if(x<2) a if ( x<2 ) si así le gusta), poner llaves en el misma línea que las definiciones de funciones, o moviéndolas a la línea de abajo, etc. Todas las opciones están controladas por los parámetros de la línea de comando.

Para usarlo en vim, simplemente configure 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 un archivo .cpp, formatprg se configura con las opciones que me gustan. Luego, puedo escribir gg para ir a la parte superior del archivo yg q G para formatear 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 teclear g q ] [ y reformateará solo esa función.

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

Aquí hay una demo. 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 ayude.


Quería agregar, para evitar que se estropee en primer lugar puede escribir :set paste antes de pegar. Después de pegar, puede escribir :set nopaste para cosas como js-beautify y sangrar para que funcione de nuevo.


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


Tal vez puedas probar lo siguiente $ indent -kr -i8 * .c

Espero que sea útil para ti!