He revisado varias preguntas sobre Stack Overflow sobre cómo convertir espacios en pestañas sin encontrar lo que necesito. Parece que hay más preguntas sobre cómo convertir pestañas en espacios, pero estoy tratando de hacer lo contrario.
En Vim
lo he intentado :retab
y :retab!
sin suerte, pero creo que esos son en realidad para ir de lengüetas a los espacios de todos modos.
Intenté ambos expand
y unexpand
en el símbolo del sistema sin suerte.
Aquí está el archivo en cuestión:
¿Cómo puedo convertir los espacios iniciales en pestañas usando Vim
o el shell?
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.find
,awk
y blackjack (demasiado tiempo para dejarlo en los comentarios, sin embargo)Respuestas:
Al usar Vim para expandir todos los espacios iniciales (más ancho que
'tabstop'
), fue correcto usarlo,retab
pero primero asegúrese de'expandtab'
reiniciar (:verbose set ts? et?
es su amigo).retab
toma un rango , por lo que generalmente especifico%
que significa "todo el archivo".Antes de hacer algo como esto (¡particularmente con archivos Python!), Generalmente configuro
'list'
, para que pueda ver el espacio en blanco y cambiar.Tengo el siguiente mapeo en mi
.vimrc
para esto:fuente
:set noet
,:set tabstop=2
,:retab!
,:%retab!
,:set tabstop=1
,:retab!
,:%retab!
%
. El mapeo F2 es exactamente como está escrito .:set noet ts=2 |%retab!
:%retab!
todavía funciona. Estaba confundido con==
, etc, que hace respetar la configuración preserveindent.:set tabstop=4
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:
¡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 deretab
.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: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:
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
.fuente
ex command
, porque esto sería lo que está dentro de la función. Y no, no es raro. Solo necesita tener cadenas con espacios para tener un desastre. No es raro en absoluto. He estado ahí Gracias por comentar^
símbolo, para comenzar la búsqueda desde el principio de la línea, corres el riesgo de cambiar los espacios dentro de las cadenas. Con la^
garantía, está cambiando solo espacios y pestañas desde el comienzo de la línea, por lo tanto, sangría. Además de eso, si está seguro de que está bien hacer todo de una vez, quítelo^
y ejecute solo una vez con::%s/\(^I*\)␣␣␣␣/\1^I/g
Traducción: Busque cada instancia de 4 espacios consecutivos (después del carácter =), pero solo si la línea completa hasta ese punto es un espacio en blanco (esto usa la aserción de ancho de cero
\@<=
). Reemplace cada instancia encontrada con un carácter de tabulación.fuente
:%s/\(^\s*\)\@<= /\t/g
: poner el número apropiado de espacios (para convertir 4 espacios en 1 pestaña, poner en 4 espacios) justo después de<=
Cambia todos los espacios a la pestaña:% s / \ s / \ t / g
fuente
Linux: con
unexpand
(yexpand
)Aquí hay una muy buena solución: https://stackoverflow.com/a/11094620/1115187 , principalmente porque usa * nix-utilities:
Linux: script personalizado
Mi respuesta original
Fragmento de bash para reemplazar la sangría de 4 espacios (hay dos
{4}
en el script) con pestañas en todos los.py
archivos de la./app
carpeta (recursivamente):No modifica 4 espacios en el medio o al final.
Fue probado en Ubuntu 16.0xy Linux Mint 18
fuente
En mi caso, tenía múltiples espacios (los campos estaban separados por uno o más espacios) que quería reemplazar con una pestaña. Lo siguiente lo hizo:
fuente
Si tiene instalados GNU coreutils, considere
%!unexpand --first-only
o para pestañas de 4 espacios, considere%!unexpand -t 4 --first-only
(--first-only
está presente en caso de que invocara accidentalmenteunexpand
con--all
).Tenga en cuenta que esto solo reemplazará los espacios que preceden a las tabulaciones prescritas, no los espacios que los siguen; no verá ninguna diferencia visual en vim a menos que muestre las pestañas más literalmente; por ejemplo, mi
~/.vimrc
contieneset list listchars=tab:▸┈
(sospecho que es por eso que pensasteunexpand
que no funcionaba).fuente
Para usar Vim para volver a capturar un conjunto de archivos (por ejemplo, todos los archivos * .ts en una jerarquía de directorios) desde, digamos, 2 espacios a 4 espacios, puede probar esto desde la línea de comandos:
Lo que está haciendo es usar
find
para pasar todos los archivos coincidentes axargs
(la opción -print0 en find funciona con la opción -0 a xargs para manejar archivos con espacios en el nombre).xargs ejecuta vim en modo ex (
-e
) en cada archivo ejecutando el comando ex dado, que en realidad son varios comandos, para cambiar los espacios iniciales existentes a pestañas, restablecer la tabulación y cambiar las pestañas a espacios y finalmente guardar y salir.Ejecutar en modo ex evita esto:
Vim: Warning: Input is not from a terminal
para cada archivo.fuente
Script Python simple:
fuente