¿Cómo puedo convertir espacios iniciales en pestañas en Vim o Linux?

Resuelto cwd asked hace 12 años • 10 respuestas

Revisé varias preguntas sobre Stack Overflow sobre cómo convertir espacios en pestañas sin encontrar lo que necesito. Parece haber más preguntas sobre cómo convertir tabulaciones en espacios, pero estoy intentando hacer lo contrario.

Lo Vimintenté :retaby :retab!sin suerte, pero creo que de todos modos sirven para pasar de pestañas a espacios.

Probé ambos expandy unexpanden el símbolo del sistema sin suerte.

Aquí está el archivo en cuestión:

http://gdata-python-client.googlecode.com/hg-history/a9ed9edefd61a0ba0e18c43e448472051821003a/samples/docs/docs_v3_example.py

¿ Cómo puedo convertir espacios iniciales en pestañas usando Vimo el shell?

cwd avatar Feb 02 '12 06:02 cwd
Aceptado

Al usar Vim para expandir todos los espacios principales (más anchos que 'tabstop'), hizo bien en usarlo, retabpero primero asegúrese 'expandtab'de restablecerlo ( :verbose set ts? et?es su amigo). retabtoma un rango , por lo que normalmente especifico %que significa "el archivo completo".

: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 Python!), generalmente configuro 'list', para poder ver los espacios en blanco y cambiar.

Tengo el siguiente mapeo en mi.vimrc para esto:

nnoremap    <F2> :<C-U>setlocal lcs=tab:>-,trail:-,eol:$ list! list? <CR>
johnsyweb avatar Feb 02 '2012 01:02 johnsyweb

1 - Si tienes espacios y quieres pestañas.

Primero, debes decidir cuántos espacios tendrá 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 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 el texto, no sólo los 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 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 cantidad de pestañas, seguida de 4 espacios, y la sustituirá por cualquier cantidad de pestañas que haya encontrado más una.

¡Desafortunadamente, esto no se ejecutará de inmediato!

Al principio, el archivo tendrá líneas que comenzarán con espacios. Luego, la búsqueda convertirá solo los primeros 4 espacios en una pestaña y permitirá lo siguiente...

Necesitas repetir el comando. ¿Cuantas veces? Hasta que consigas un pattern not found. Todavía no puedo pensar en una manera de automatizar el proceso. Pero si lo haces:

`10@:`

Probablemente ya hayas terminado. Este comando repite la última búsqueda/reemplazo 10 veces. No es probable que su programa tenga tantas sangrías. Si es así, simplemente repita de nuevo @@.

Ahora, sólo para completar la respuesta. Sé que pediste lo contrario, pero nunca sabes cuándo necesitas deshacer cosas.

2 - Tienes pestañas y quieres espacios.

Primero, decida a cuántos espacios desea convertir 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 es mejor estilo de programación no usar pestañas duras dentro de cadenas, en realidad estás haciendo algo bueno aquí. Si realmente necesita una pestaña dentro de una cadena, use \t.

DrBeco avatar Aug 24 '2014 16:08 DrBeco
:%s/\(^\s*\)\@<=    /\t/g

Traducción: busque cada instancia de 4 espacios consecutivos (después del carácter =), pero solo si toda la línea hasta ese punto es un espacio en blanco (esto utiliza la aserción de búsqueda hacia atrás de ancho cero) \@<=. Reemplace cada instancia encontrada con un carácter de tabulación.

Simon Zuckerbraun avatar Jan 28 '2016 00:01 Simon Zuckerbraun