Primero, debe decidir cuántos espacios tendrán una sola pestaña. Dicho esto, supongamos que tiene líneas con 4 espacios iniciales u 8 ... Entonces se da cuenta de que probablemente desee que una tabulación tenga 4 espacios. Ahora con esa información, haces:
:set ts=4
:set noet
:%retab!
¡Aquí hay un problema! Esta secuencia de comandos buscará todo el texto, no solo los espacios al comienzo de la línea. Eso significa una cadena como:"Hey,␣this␣␣␣␣is␣4␣spaces"
se convertirá en "Hey,␣this⇥is␣4␣spaces"
, ¡pero no lo es! ¡es una pestaña!.
Para resolver este pequeño problema recomiendo un search
, en lugar de retab
.
:%s/^\(^I*\)␣␣␣␣/\1^I/g
Esta búsqueda buscará en todo el archivo cualquier línea que comience con cualquier número de pestañas, seguido de 4 espacios, y lo sustituirá por cualquier número de pestañas encontrado más uno.
¡Esto, lamentablemente, no se ejecutará de inmediato!
Al principio, el archivo tendrá líneas que comienzan con espacios. La búsqueda convertirá solo los primeros 4 espacios en una pestaña y dejará lo siguiente...
Tienes que repetir el comando. ¿Cuantas veces? Hasta que obtengas un pattern not found
. No puedo pensar en una manera de automatizar el proceso todavía. Pero si lo haces:
`[email protected]:`
Probablemente haya terminado. Este comando repite la última búsqueda/reemplazo 10 veces. No es probable que su programa tenga tantas sangrías. Si es así, repite de nuevo @@
.
Ahora, solo para completar la respuesta. Sé que pediste lo contrario, pero nunca sabes cuándo necesitas deshacer las cosas.
Primero, decida a cuántos espacios desea que se conviertan sus pestañas. Digamos que desea que cada pestaña tenga 2 espacios. Luego haces:
:set ts=2
:set et
:%retab!
Esto tendría el mismo problema con las cadenas. Pero como su mejor estilo de programación es no usar tabulaciones duras dentro de las cadenas, en realidad estás haciendo algo bueno aquí. Si realmente necesita una pestaña dentro de una cadena, use \t
.
Uso de Vim para expandir todos los principales espacios (más ancho que 'tabstop'
), hiciste bien en usar retab
pero primero asegúrese de 'expandtab'
se restablece (:verbose set ts? et?
es tu amigo). retab
toma un rango , por lo que normalmente especifico %
para significar "todo el archivo".
:set tabstop=2 " To match the sample file
:set noexpandtab " Use tabs, not spaces
:%retab! " Retabulate the whole file
Antes de hacer algo como esto (¡particularmente con archivos de Python!), generalmente configuro 'list'
, para que pueda ver el espacio en blanco y el cambio.
Tengo el siguiente mapeo en mi .vimrc
por esto:
nnoremap <F2> :<C-U>setlocal lcs=tab:>-,trail:-,eol:$ list! list? <CR>