texto por online editar convertir consola comando archivos archivo linux vim tabs spaces

linux - por - vi ir al final del archivo



¿Cómo puedo convertir espacios en pestañas en Vim o Linux? (6)

Bash snippet para reemplazar la sangría de 4 espacios (hay dos {4} en el guión) con pestañas en todos los archivos .py en la carpeta ./app (recursivamente):

find ./app -iname ''*.py'' -type f / -exec awk -i inplace / ''{ match($0, /^(( {4})*)(.*?)$/, arr); gsub(/ {4}/, "/t", arr[1]) }; { print arr[1] arr[3] }'' {} /;

No modifica 4 espacios en el medio o al final.

Fue probado bajo Ubuntu 16.0x y Linux Mint 18

He revisado varias preguntas sobre Stack Overflow para saber cómo convertir espacios en pestañas sin encontrar lo que necesito. Parece haber 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 en realidad son para pasar de pestañas a espacios de todos modos.

Intenté expand y unexpand en 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 Vim o el caparazón?


Cambia todos los espacios a la pestaña:% s / / s / / t / g


Script simple de Python:

import os SOURCE_ROOT = "ROOT DIRECTORY - WILL CONVERT ALL UNDERNEATH" for root, dirs, files in os.walk(SOURCE_ROOT): for f in files: fpath = os.path.join(root,f) assert os.path.exists(fpath) data = open(fpath, "r").read() data = data.replace(" ", "/t") outfile = open(fpath, "w") outfile.write(data) outfile.close()


Usando Vim para expandir todos los espacios ''tabstop'' (más ancho que ''tabstop'' ), tenías razón al usar retab pero primero asegúrate de que ''expandtab'' se restablezca ( :verbose set ts? et? Es tu amigo). retab toma un rango , por lo que generalmente especifico % para que signifique "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 (¡especialmente con archivos de Python!), Generalmente configuro ''list'' para que pueda ver el espacio en blanco y cambiar.

Tengo la siguiente asignación en mi .vimrc para esto:

nnoremap <F2> :<C-U>setlocal lcs=tab:>-,trail:-,eol:$ list! list? <CR>


1 - Si tiene espacios y quiere pestañas.

En primer lugar, debe decidir cuántos espacios tendrán una sola pestaña. Dicho eso, supongamos que tiene líneas con 4 espacios principales, u 8 ... Entonces se dará cuenta de que probablemente quiera una ficha para 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á en "Hey,␣this⇥is␣4␣spaces" , ¡pero no es así! es una pestaña !.

Para resolver este pequeño problema recomiendo una 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 cantidad de pestañas, seguida de 4 espacios, y la sustituirá por el número de pestañas que encuentre más una.

¡Desafortunadamente, esto 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 ...

Necesitas repetir el comando. ¿Cuantas veces? Hasta que obtenga un pattern not found . No puedo pensar en una forma de automatizar el proceso todavía. Pero si lo haces:

`10@:`

Probablemente ya termines. Este comando repite la última búsqueda / reemplazo por 10 veces. No es probable que tu programa tenga tantas sangrías. Si tiene, simplemente repita nuevamente @@ .

Ahora, solo para completar la respuesta. Sé que pediste lo contrario, pero nunca sabes cuándo tienes que deshacer las cosas.

2 - Tienes pestañas y quieres espacios.

Primero, decida a cuántos espacios desea que se conviertan sus pestañas. Digamos que quiere que cada pestaña sea de 2 espacios. Entonces 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 pestañas duras dentro de las cadenas, en realidad estás haciendo algo bien aquí. Si realmente necesita una pestaña dentro de una cadena, use /t .


:%s//(^/s*/)/@<= //t/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 búsqueda de ancho cero, /@<= ). Reemplace cada instancia encontrada con un carácter de tabulación.