1 - Si tienes espacios y quieres pestañas.
Primero, debe decidir cuántos espacios tendrá una sola pestaña. Dicho esto, suponga que tiene líneas con 4 espacios iniciales, u 8 ... Entonces se da cuenta de que probablemente desee que una pestaña tenga 4 espacios. Ahora con esa información, haces:
:set ts=4
:set noet
:%retab!
¡Hay un problema aquí! Esta secuencia de comandos buscará todo su texto, no solo espacios al comienzo de la línea. Eso significa que una cadena como: "Hey,␣this␣␣␣␣is␣4␣spaces"
se convertirá "Hey,␣this⇥is␣4␣spaces"
, ¡pero no lo es! es una pestaña!
Para resolver este pequeño problema, recomiendo a search
, en lugar de retab
.
:%s/^\(^I*\)␣␣␣␣/\1^I/g
Esta búsqueda buscará en el archivo completo cualquier línea que comience con cualquier número de pestañas, seguido de 4 espacios, y la sustituirá por el número de pestañas que encontró más uno.
¡Esto, desafortunadamente, no se ejecutará de inmediato!
Al principio, el archivo tendrá líneas que comienzan con espacios. La búsqueda luego convertirá solo los primeros 4 espacios en una pestaña, y dejará lo siguiente ...
Necesitas repetir el comando. ¿Cuantas veces? Hasta que consigas un pattern not found
. Todavía no puedo pensar en una forma de automatizar el proceso. Pero si lo haces:
`10@:`
Probablemente ya terminaste. Este comando repite la última búsqueda / reemplazo por 10 veces. No es probable que su programa tenga tantas sangrías. Si es así, solo repite de nuevo @@
.
Ahora, solo para completar la respuesta. Sé que pediste lo contrario, pero nunca sabes cuándo necesitas deshacer las cosas.
2 - Tienes pestañas y quieres espacios.
Primero, decida a cuántos espacios desea convertir sus pestañas. Digamos que quieres que cada pestaña tenga 2 espacios. Entonces haces:
:set ts=2
:set et
:%retab!
Esto tendría el mismo problema con las cadenas. Pero como es un mejor estilo de programación para no usar pestañas 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
.
sed "s/ +/`echo -e '\t'`/g" < input.py > output.py
) parece convertir todos los espacios, no solo los espacios iniciales. En el segundo ejemplo (sed "s/^ +/`echo -e '\t'`/g" < input.py > output.py
) solo reemplaza el primer espacio en cada línea con una pestaña y deja el resto de ellos.