1 - Se hai spazi e vuoi schede.
Innanzitutto, devi decidere quanti spazi avranno una singola scheda. Detto questo, supponiamo di avere linee con 4 spazi iniziali, o 8 ... Di quanto ti rendi conto che probabilmente vuoi che una scheda sia di 4 spazi. Ora con queste informazioni, fai:
:set ts=4
:set noet
:%retab!
C'è un problema qui! Questa sequenza di comandi cercherà tutto il testo, non solo gli spazi all'inizio della riga. Ciò significa che una stringa come: "Hey,␣this␣␣␣␣is␣4␣spaces"
diventerà "Hey,␣this⇥is␣4␣spaces"
, ma non lo è! è una scheda !.
Per risolvere questo piccolo problema, raccomando a search
, invece di retab
.
:%s/^\(^I*\)␣␣␣␣/\1^I/g
Questa ricerca cercherà nell'intero file tutte le righe che iniziano con qualsiasi numero di schede, seguite da 4 spazi e lo sostituiranno con qualsiasi numero di schede trovate più una.
Questo, sfortunatamente, non funzionerà subito!
Inizialmente, il file avrà linee che iniziano con spazi. La ricerca convertirà quindi solo i primi 4 spazi in una scheda e consentirà quanto segue ...
Devi ripetere il comando. Quante volte? Fino a quando non ottieni un pattern not found
. Non riesco ancora a pensare a un modo per automatizzare il processo. Ma se lo fai:
`10@:`
Probabilmente hai finito. Questo comando ripete l'ultima ricerca / sostituzione per 10 volte. Non è probabile che il tuo programma abbia così tanti rientri. In tal caso, ripeti di nuovo @@
.
Ora, solo per completare la risposta. So che hai chiesto il contrario, ma non sai mai quando devi annullare le cose.
2 - Hai schede e desideri spazi.
Innanzitutto, decidi in quanti spazi vuoi convertire le tue schede. Diciamo che vuoi che ogni scheda sia di 2 spazi. Quindi fai:
:set ts=2
:set et
:%retab!
Ciò avrebbe lo stesso problema con le stringhe. Ma dato che è il suo migliore stile di programmazione per non usare schede rigide all'interno delle stringhe, in realtà stai facendo una buona cosa qui. Se hai davvero bisogno di una scheda all'interno di una stringa, usa \t
.
sed "s/ +/`echo -e '\t'`/g" < input.py > output.py
) sembra convertire tutti gli spazi, non solo gli spazi iniziali. Nel secondo esempio (sed "s/^ +/`echo -e '\t'`/g" < input.py > output.py
) sostituisce solo il primo spazio su ogni riga con una scheda e ne lascia il resto.