¿Cómo soluciono la sangría de un archivo completo en Vi?


625

En Vim, ¿cuál es el comando para corregir la sangría de todas las líneas?

Muchas veces copio y pego el código en un terminal remoto y lo arruino todo. Quiero arreglar esto de una sola vez.



8
Es mejor prevenir que curar. En ese espíritu viene este comentario. Haga un ": set paste" antes de ingresar al modo de inserción y pegar el código desde la terminal remota.
Proyecto Chthonic

Respuestas:


1215

=, el comando de sangría puede tomar movimientos. Por lo tanto, ggpara obtener el inicio del archivo, =al guión, Gal final del archivo, gg=G.


39
Nunca podré desaprender mi precioso 1G =) Uno de mis favoritos es =% parado en un paréntesis de apertura. Corrige las sangrías de todo el bloque.
PEZ

2
: 0 <retorno> no es tan malo pero gg es bueno. (sí, aprendí ed primero)
Erik Olson

8
¿Puedo sangrar todo el archivo sin salir de la línea actual?
Fábio Perez

86
@ Fábio: ''(dos comillas simples) te lleva de regreso a donde estabas, así que gg=G''debes sangrar y luego regresar.
Nemo157

El archivo vim de @ArchimedesTrajano Mac OS es muy antiguo, recomiendo la versión de HomeBrew; Es mucho más nuevo. Tuve algunos problemas molestos con vim de Mac. Además, escuché que no debes meterte con el incorporado, así que no intentes actualizarlo tú mismo a menos que tengas mucho cuidado.
AlexMA

126

Antes de pegar en la terminal, intente :set pastey luego una :set nopastevez que haya terminado. Esto desactivará la sangría automática, el ajuste de línea y otras características que están estropeando su pegado.

editar: Además, debo señalar que, por lo =general, se puede obtener un resultado mucho mejor que la sangría utilizando un programa externo. Por ejemplo, corro :%!perltidytodo el tiempo. astyle, cindent, Etc. también pueden ser utilizados. Y, por supuesto, puede asignarlos a una pulsación de tecla y asignar diferentes a la misma pulsación de tecla según el tipo de archivo.


55
Puede configurar la equalprgopción en un ftplugin para usar un filtro externo para la =sangría, en lugar de una combinación de teclas personalizada.
Josh Lee

También hay una opción de combinación de teclas para pegar, por ejemplo. : configure pt \ p para cambiar entre modos
michael

Nota: en vimconfig de grml la tecla pastetoggle se asigna a F11
Thomas

Lo uso formatpgmcon ordenado y astyle y luego gq. Estos son algunos ejemplos de mi .vimrc: au FileType xml set fp=tidy\ -q\ -i\ -xmlyau FileType java set fp=/usr/local/bin/astyle\ --mode=java\ --indent=tab
Raffi Khatchadourian

Acabo de descargar Perltidy después de leer esto, es mucho mejor que la sangría automática de vim predeterminada
Joey Ciechanowicz

29

Si desea reiniciar el bloque en el que se encuentra sin tener que escribir ningún acorde, puede hacer lo siguiente:

[[=]]

1
Lamento revivir esto, pero ¿qué quisiste decir con acordes? Coords?
John P

77
"Acordes" aquí se refiere a comandos emitidos al mantener presionada una tecla mientras se presiona otra, en analogía con los acordes musicales, sonaron varias notas a la vez. Entonces G es shift + g, ^] es ctrl +], y así sucesivamente. Estos tardan más en escribir que los enlaces de una sola tecla.
Ralph Giles

También puede usar el =aBcual no moverá el cursor en absoluto.
amin

77
En el teclado nórdico, [[=]]requiere 5 acordes :(
k4kuz0

29

El maestro de todos los comandos es

gg=G

¡Esto sangra todo el archivo!

Y a continuación se muestran algunos de los comandos simples y elegantes utilizados para sangrar líneas rápidamente en Vim o gVim.

Para sangrar todas las líneas debajo de la línea actual

=G

Para sangrar la línea actual

==

Para sangrar nlíneas debajo de la línea actual

n==

Por ejemplo, para sangrar 4 líneas debajo de la línea actual

4==

Para sangrar un bloque de código, vaya a una de las llaves y use el comando

=%

17

Puede usar la aplicación / utilidad ordenada para sangrar archivos HTML y XML y funciona bastante bien para sangrar esos archivos.

Prettificar un archivo XML

:!tidy -mi -xml %

Prettificar un archivo HTML

:!tidy -mi -html %

16

presione escape y luego escriba las combinaciones siguientes rápidamente:

gg=G

28
Escribí lentamente, no vas a creer lo que pasó después.
k0pernikus

Acabo de dar la respuesta y el comentario un voto positivo porque eso no tiene precio! lol @ k0pernikus
gafas

12

1G=G. Eso debería sangrar todas las líneas del archivo. 1Gte lleva a la primera línea, =iniciará la sangría automática y la final Gte llevará a la última línea del archivo.


O incluso1gg=G
Biggybi

1G = G lo arregló para mí. ¡Increíble!
Natus Drew

8

:set pastees tu amiga yo uso masilla y termino copiando código entre ventanas. Antes de activar :set paste(y :set nopaste) copiar / pegar me dio ajustes por esa misma razón.


1
Sí, también estoy usando masilla. : establecer pegar es increíble
mmcdole

7

En Vim, usa :insert . Esto mantendrá todo su formato y no hará autoindenting. Para obtener más información help :insert.


7

si no desea usar :set paste, haga clic con el botón central set nopaste, también puede pegar el contenido del portapapeles:

"*p
"+p

De esa manera no tienes que salir del modo normal. si tiene que pegar +o *depende de cómo seleccionó el texto, vea :help quoteplus.


4

vim-autoformat formatea sus archivos fuente usando programas externos específicos para su idioma, por ejemplo, la gema "rbeautify" para archivos Ruby, el paquete npm "js-beautify" para JavaScript.


3

Para archivos complejos de C ++, vim no siempre obtiene el formato correcto cuando se usa el =comando de filtro de vim . Entonces, para tales situaciones, es mejor usar un formateador externo de C ++ como un estilo (o incrustación ), por ejemplo:

:%!astyle

La función '=' de Vim usa su formateador interno de manera predeterminada (que no siempre hace las cosas bien) pero también puede configurarlo para que use un formateador externo, como un estilo, configurándolo adecuadamente como se discutió en esta pregunta .



1

Puede crear una asignación para hacer esto por usted.

Éste sangrará automáticamente todo el archivo y aún mantendrá el cursor en la posición en la que se encuentra:

nmap <leader>ai mzgg=G`z

0

Para vi Editor, use: insert. Esto mantendrá todo su formato y no insertará sangría automática. Una vez hecho, presione escape para ver el archivo formateado real; de lo contrario, verá algunos caracteres basura. como ^ I eg:

public static void main(String[] args) {
^I
^I System.out.println("Some Garbage printed upon using :insert"); 
}

0

Simplemente vaya al modo visual en vim, y seleccione de arriba a abajo líneas después de seleccionar simplemente presione =, Toda la línea seleccionada se sangrará.


Yo evitaría esto. El modo visual es para cuando no estás seguro de tus movimientos, si sabes cómo capturar un conjunto de personajes, entonces no tiene sentido el paso adicional de pasar al modo visual. ¿Por qué ggvG=cuando puedes gg=G? ¿Cuál era el punto de hacer visible el movimiento? Eso se aplica a todas las acciones que toman movimientos.
alextes
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.