2010-03-24 12 views
31

Soy bastante nuevo en VIM. Tengo un código fuente y esto es un desastre. A primera vista, me gustaría obtener al menos una visión clara y organizada del código, por lo que me gustaría tenerlo correctamente formateado, me refiero a sangría dependiendo de la profundidad de las funciones y demás.¿Es posible formatear el código de C++ con VIM?

Me pregunto si se puede hacer con VIM y, de lo contrario, qué otras herramientas de línea de comandos puede recomendar.

Gracias

Respuesta

58

Mientras vim es un verdadero cuchillo Swiss-yo prefiero herramientas externas para algunos trabajos. Este enfoque es a veces mucho más intuitivo y fácil de recordar que usar el equivalente incorporado.

En el caso de la sangría, filtro toda la memoria intermedia de archivos a través de astyle. Los parámetros astyle son mucho más fáciles de comprender en un par de minutos, especialmente si no eres un gurú vim. También astyle proporciona mucha más flexibilidad para ajustar la salida.

Primero instale astyle:
# apt-get install astyle

luego dentro de vim:
:%!astyle (caso simple - el modo por defecto astyle es C/C++) :%!astyle --mode=c --style=ansi -s2 (ANSI C++ estilo
o
, utilizar dos espacios por nivel de sangría)
o
:1,40!astyle --mode=c --style=ansi (ANSI C++ estilo, filtra sólo las líneas 1-40)

+4

guau, esto es realmente genial, muchas gracias – flow

+0

¿Es posible asignar esto a una combinación de teclas como ctrl + shift + F? –

+4

También puede anular el operador de sangría de Vim ('=') para usar Astyle estableciendo 'equalprg' en astyle (por ejemplo:' set equalprg = ~/astyle \ --style = google') – Parsa

26

puede hacer lo siguiente:

gg=G 
+1

Para aclarar, = [movimiento] sangra la región abarcada por el movimiento. gg se mueve al principio del archivo y G se mueve al final del archivo. – Sarah

+1

o comience con 'V' para ingresar al modo de línea visual, luego mueva hacia abajo con' j' para seleccionar todas las líneas que desea formatear, luego presione '=' – hasen

+1

No me gusta 'gg = G'. ¿Por qué? Porque cuando se rompe la lista larga con comas (lista de argumentos, booleanos largos) se romperá la alineación manual. – Benoit

4

Vim definitivamente hacer esto, aunque los resultados pueden no ser perfecto:

  1. En primer lugar, seleccione el archivo completo en Visual modo: ggVG
  2. Luego pulse = para reiniciar todo.

se puede aprender más acerca del comando de igualdad con: :help =

1

Una solución genérica a lo largo de las líneas de la idea de m000 es usar UniversalIndentGUI como una herramienta externa.

+0

gracias por la información , pero prefiero VIM porque tengo que depurar código en máquinas remotas – flow

4

Hay un complemento vim que permite formatear su código desde vim. Se llama vim-formato automático y se puede descargar desde aquí:

https://github.com/Chiel92/vim-autoformat

que integra los programas de formateo de código externas en vim. Por ejemplo, si desea formatear el código C, C++, C# o Java, debe instalar el programa astyle y vim lo configura automáticamente como el programa de formato.

2

No escribo código C++, pero escribo código Java.

En cambio, Vim admite el formato de algunos lenguajes comunes. He configurado un atajo para formatear todo el código en el búfer. volverá a la línea que acaba de editar :)

" format the file 
map <leader>fm gg=G'. 
0

sólo tenía que resolver este problema exacto, así que pensé que iba a contribuir a salvar a otros algún tiempo.

Puede utilizar gg=G para sangrar el código. Pero las cosas se vuelven difíciles de entender en el momento en que desea ajustar cómo ocurre el autodentado. Por lo tanto, si sólo se preocupan de que se elimina el espacio en blanco andante y realmente no se preocupan por estilo de formato, gg=G es la forma más rápida de hacerlo, porque su base.

Si desea controlar el estilo (por ejemplo, intenta hacer que su código se ajuste a a style guide), entonces necesitará una herramienta externa para procesar su archivo. Puede invocar esa herramienta desde vim con: :%!<toolname> <options>. Esto canaliza el archivo a través de la herramienta y vuelve a cargar el resultado procesado. (Es obvio que se puede utilizar esto para cualquier otra cosa que usted quiere hacer a su archivo también)

Así que la siguiente pregunta es, ¿qué herramienta externa debe elegir? En cualquier caso, el método es el mismo:

  1. instalar la herramienta de elección
  2. Asegúrese de que su en su camino
  3. añadir una línea a su archivo vimrc que crea una clave de acceso directo para utilizar lo que ahorrará tiempo
  4. Úselo.

Ahora, la herramienta que utiliza depende del estilo que intenta replicar. Si intentas replicar un estilo ampliamente utilizado, entonces lo más probable es astyle es todo lo que necesitas.

Si usted está tratando de reproducir un estilo personalizado, a continuación, se necesitan dos cosas:

  1. UniversalIndentGui - una interfaz que le permite jugar un poco con varias opciones y vivir-vista previa de su efecto sobre la fuente presentar
  2. Un conjunto de herramientas de formato de código de código instaladas y en su camino

Entre uncrustify y greatcode, usted debería ser capaz de replicar completamente el estilo que desee.

En realidad, mentí. Hay otra manera y se llama clang-format. Sin embargo, querrá leer la documentación y todavía está en etapas iniciales, por lo que algunas opciones no funcionan muy bien. Sin embargo, es una herramienta hermosa (definitivamente la más inteligente del lote porque construye un AST de su código) e incluso está disponible para Windows.

Si usted va a tomar el tiempo para leer el manual, también desee comprobar hacia fuera GNU Indent.

Por supuesto, no es la última forma, que en realidad está tomando el tiempo para aprender las reglas de sangría de vim y escribir uno para su estilo. Tomará tiempo, pero funcionará con gg=G.

Algunas notas sobre astyle vs vs Uncrustify GreatCode:

  1. Astyle es bueno para el formato general, pero no puede hacer cosas como alinear la declaración de variables y comentarios re-estilo muy bien.
  2. Uncrustify puede hacer MUCHAS cosas que astyle no puede, pero prepárate para pasar una hora jugando hasta que encuentres la combinación correcta de opciones que necesitas. (O si tiene ganas de perder mucho tiempo, use algoritmos genéticos para descubrir la mejor combinación de opciones para su estilo y cuando comparta el código y déme un enlace para que pueda usarlo también :))

Tenga en cuenta que no tiene que elegir una herramienta. Con vim, puede asignar una pulsación de tecla para ejecutar varios comandos en sucesión, por lo que, teóricamente, podría usar una combinación de estas herramientas para obtener exactamente lo que está buscando.

Por último, pero no menos importante, aquí es un extracto de mi archivo .vimrc, donde he mapeado F12 para invocar astyle con algunas opciones:

"A2 = attached brackets 
"-s8 indent 8 spaces 
"-xc attached braces to class declarations 
"-xj remove braces for single statement ifs and elses 
"-c convert tabs to spaces in the non-indentation part of the line 
map <F12> :%!astyle -A2 -s8 -xc -xj -c<CR> 

no me juez en el estilo. Solo usa la herramienta para reproducir lo que quieras.

13

Recomiendo mucho el formato clang hoy en día. Permite la integración sencilla de sonido metálico de formato en Vim, una vez que haya formato clang instalado:

http://clang.llvm.org/docs/ClangFormat.html#vim-integration

Es el único embellecedor de código que realmente entiende su código C++, y es realmente inteligente para embellecer el código más como un ser humano que una máquina. Por ejemplo:

void TestFunction(int argument1, int argument2, 
        int argument3); 
void TestFunctionVeryLongName(int argument1, 
           int argument2, 
           int argument3); 
void TestFunctionWithRidiculouslyLongName(
    int argument1, int argument2, int argument3); 
+1

Una alternativa a las combinaciones de teclas sugeridas en el manual de formato clang es usar la vinculación 'equalprg' en vim. Esto le permite invocar 'clang-format' con' G = gg' u otras '=' opciones de sangría. sólo hay que poner lo siguiente en su archivo '.vimrc': ' autocmd FileType c, cpp setlocal equalprg = sonido metálico-format' – Daniel

Cuestiones relacionadas