¿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.

mmcdole
fuente
Similar: Re-sangrado de código mal sangrado en Vi SE
kenorb
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.

Logan Capaldo
fuente
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.

derobert
fuente
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:

[[=]]
Andrew Wagner
fuente
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

=%
Sagar Jain
fuente
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 %
Naga Kiran
fuente
16

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

gg=G
tokhi
fuente
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.

Amjith
fuente
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.

Elsporko
fuente
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.

Eric Johnson
fuente
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.

0x89
fuente
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.

Wojtek Kruszewski
fuente
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 .

Pierz
fuente
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
Sergio D. Márquez
fuente
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"); 
}
ps2090
fuente
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á.

Ramanand Yadav
fuente
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