1 - Jeśli masz spacje i chcesz tabulatory.
Najpierw musisz zdecydować, ile spacji będzie miało jedną kartę. To powiedziawszy, załóżmy, że masz linie z wiodącymi 4 spacjami lub 8 ... Niż zdajesz sobie sprawę, że prawdopodobnie chcesz, aby tabulator miał 4 spacje. Teraz dzięki tym informacjom wykonujesz:
:set ts=4
:set noet
:%retab!
Tutaj jest problem! Ta sekwencja poleceń wyszuka cały tekst, a nie tylko spacje na początku wiersza. Oznacza to, że ciąg: "Hey,␣this␣␣␣␣is␣4␣spaces"
stanie się "Hey,␣this⇥is␣4␣spaces"
, ale nie jest! jest to zakładka!
Aby rozwiązać ten mały problem, polecam search
zamiast retab
.
:%s/^\(^I*\)␣␣␣␣/\1^I/g
To wyszukiwanie sprawdzi w całym pliku wszelkie wiersze zaczynające się od dowolnej liczby tabulatorów, po których następują 4 spacje, i zastąpi je dowolną liczbą znalezionych tabulatorów plus jedną.
To niestety nie będzie działać od razu!
Na początku plik będzie miał linie zaczynające się od spacji. Wyszukiwanie przekształci wtedy tylko pierwsze 4 spacje w tabulatory i niech następujące ...
Musisz powtórzyć polecenie. Ile razy? Dopóki nie dostaniesz pattern not found
. Nie mogę jeszcze wymyślić sposobu na automatyzację tego procesu. Ale jeśli to zrobisz:
`10@:`
Prawdopodobnie skończyłeś. To polecenie powtarza ostatnie wyszukiwanie / zamianę 10 razy. Jest mało prawdopodobne, że twój program będzie miał tyle wcięć. Jeśli tak, po prostu powtórz ponownie @@
.
Teraz, aby uzupełnić odpowiedź. Wiem, że prosiłeś o coś przeciwnego, ale nigdy nie wiesz, kiedy musisz coś cofnąć.
2 - Masz tabulatory i chcesz spacji.
Najpierw zdecyduj, na ile spacji chcesz przekonwertować karty. Powiedzmy, że chcesz, aby każda karta miała 2 spacje. Następnie wykonujesz:
:set ts=2
:set et
:%retab!
Miałoby to ten sam problem z łańcuchami. Ale ponieważ jest to lepszy styl programowania, aby nie używać twardych tabulatorów wewnątrz ciągów, tak naprawdę robisz tutaj dobrą rzecz. Jeśli naprawdę potrzebujesz tabulatora wewnątrz ciągu, użyj \t
.
sed "s/ +/`echo -e '\t'`/g" < input.py > output.py
pojawia się pierwszy przykład ( ) do konwersji wszystkich spacji, a nie tylko spacji wiodących. W drugim przykładzie (sed "s/^ +/`echo -e '\t'`/g" < input.py > output.py
) zamienia tylko pierwszą spację w każdym wierszu tabulatorem i pozostawia resztę.