¿Es posible convertir pestañas en espacios, manteniendo la alineación del texto?
Simplemente reemplazar solo funciona de manera útil cuando no hay personajes principales.
¿Es posible convertir pestañas en espacios, manteniendo la alineación del texto?
Simplemente reemplazar solo funciona de manera útil cuando no hay personajes principales.
Respuestas:
Puedes usar el :retab
comando. De
:help :retab
Reemplace todas las secuencias de espacios en blanco que contengan a
<Tab>
con nuevas cadenas de espacios en blanco utilizando el nuevo valor de tabulación dado. Si no especifica un nuevo tamaño de tabulación o es cero, Vim usa el valor actual de'tabstop'
. [...] Con'expandtab'
activado, Vim reemplaza todas las pestañas con el número apropiado de espacios.
Tenga en cuenta que el comando acepta un rango, por lo que puede hacer una selección visual y luego solo :retab
las líneas seleccionadas.
:retab
Sin embargo, puede usar , como se indicó, esto cambiará todas las pestañas a espacios, no solo las pestañas al comienzo de la línea
Entonces esto (donde ⇥
es un carácter de tabulación):
if :; do
⇥echo "⇥hello"
end
se cambia a (donde ␣
hay un espacio):
if :; do
␣␣echo "␣␣hello"
end
¡Esto puede producir efectos secundarios inesperados en algunos escenarios, y es aún más un problema al cambiar los espacios a pestañas!
Entonces, escribí una pequeña función para cambiar solo las pestañas / espacios al comienzo de la línea:
" :retab changes *everything*, not just start of lines
fun! Retab(expandtab)
let l:spaces = repeat(' ', &tabstop)
" Replace tabs with spaces
if a:expandtab
silent! execute '%substitute#^\%(' . l:spaces . '\)\+#\=repeat("\t", len(submatch(0)) / &tabstop)#e'
" Replace spaces with tabs
else
silent! execute '%substitute#^\%(\t\)\+#\=repeat("' . l:spaces . '", len(submatch(0)))#e'
endif
endfun
Con esta versión, debe especificar manualmente expandtab
en la llamada de función (es decir, :call Retab(1)
para cambiar las pestañas a espacios), pero también puede modificarlo para tomar el valor actual de &expandtab
(como ya lo hace con &tabstop
) al igual que lo :retab
hace. (Prefiero especificarlo manualmente).
a
en if a:expandtab
?
set expandtab
en su .vimrc y luego autocmd BufWritePre * :call Retab(&expandtab)
, la sangría se cambiará a pestañas, en lugar de espacios.
¡Vim proporciona un !retab
comando que reemplazará todas las secuencias de <Tab>
con nuevas cadenas de espacio en blanco usando el nuevo valor de tabulación (por ejemplo :set tabstop=2
) dado, pero todas las pestañas dentro de las cadenas se pueden modificar (por ejemplo, en un programa en C, debe usar \t
para evitar esto)!
De manera alternativa, puede cambiar todas las pestañas a espacios con el siguiente comando:
:%s/\t/ /g
o como lo sugiere @Shahbaz :
:%s/^\t\+/ g
Por lo tanto, solo las pestañas utilizadas en sangría se convierten.
Explicación:
%
representa todo el búfer / archivo ( :help :%
)s
significa sustituto ( :help sub-replace-special
)\t
, o ^I
significa pestaña
- use tantos espacios como necesite por una pestañag
- significa global, y convertirá múltiples ocurrencias de pestañas en la misma líneaA continuación, para corregir la sangría de todo el archivo, puede intentar: gg=G. Verificación: Re-sangría de código mal sangrado para más detalles.
Para usar espacios de forma predeterminada en lugar de pestañas, debe agregar la siguiente configuración a su .vimrc
archivo:
set tabstop=2 " (ts) width (in spaces) that a <tab> is displayed as
set expandtab " (et) expand tabs to spaces (use :retab to redo entire file)
set shiftwidth=2 " (sw) width (in spaces) used in each step of autoindent (aswell as << and >>)
La solución alternativa es usar tidy
Relacionado:
%s/^\t\+/ g
para que solo se conviertan las pestañas utilizadas en la sangría. Además, gg=G
podría ser catastrófico con lenguajes como Python.
Intenta usar:
expand -t 4 input_filename output_filename
expand
es una herramienta de línea de comandos para convertir pestañas en espacios, que puede ejecutar desde un shell o con :!expand
.
Está en POSIX, por lo que debería estar disponible en la mayoría de los sistemas. unexpand
hará lo contrario, por cierto.
expand
?
:%!expand -t 4
dentro de vim. Mejor aún, también podría usar la opción de ancho de turno actual: :exe '%!expand -t ' . &shiftwidth
Para completar, =
también podría usarse para corregir sangrías, después de que haya especificado que las pestañas se reemplacen con espacios. En modo normal, puede hacerlo escribiendo :set expandtab
. Entonces =
podría usarse de dos maneras:
=
solucionaría las sangrías de los bloques de código seleccionados.gg=G
arreglaría todo el archivo, donde gg
mueve el cursor al comienzo del archivo, luego =
se aplica y G
mueve el cursor al final del archivo.Referencia: enlace
:h vim-faq
y buscar/tab characters
. La etiqueta difícil de memorizar es:h faq-14.16
.