Przejrzałem kilka pytań na temat przepełnienia stosu, aby przekonwertować spacje na tabulatory bez znajdowania tego, czego potrzebuję. Wydaje się, że jest więcej pytań na temat konwersji tabulatorów na spacje, ale staram się zrobić odwrotnie.
W Vim
Próbowałem :retab
i :retab!
bez powodzenia, ale wydaje mi się, że i tak są przeznaczone do przechodzenia od zakładek do spacji.
Próbowałem obu expand
i unexpand
w wierszu polecenia bez powodzenia.
Oto plik, o którym mowa:
Jak przekonwertować spacje wiodące na tabulatory za pomocą Vim
powłoki lub powłoki?
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ę.find
,awk
i blackjack (zbyt długi, aby pozostawić go w komentarzach, choć)Odpowiedzi:
Używając Vima do rozszerzenia wszystkich wiodących pól (szerszych niż
'tabstop'
), miałeś rację,retab
ale najpierw upewnij się, że'expandtab'
został zresetowany (:verbose set ts? et?
jest twoim przyjacielem).retab
ma zakres , więc zwykle określam%
jako „cały plik”.Przed zrobieniem czegoś takiego (szczególnie z plikami Pythona!) Zwykle ustawiam
'list'
, aby widzieć białe znaki i zmieniać.Mam następujące mapowania w moim
.vimrc
do tego:źródło
:set noet
,:set tabstop=2
,:retab!
,:%retab!
,:set tabstop=1
,:retab!
,:%retab!
%
. Mapowanie F2 jest dokładnie tak, jak zostało wpisane .:set noet ts=2 |%retab!
:%retab!
nadal działa. Byłem zmieszany z==
, itp, które nie respektują ustawienia preserveindent.:set tabstop=4
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:
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
zamiastretab
.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: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:
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
.źródło
ex command
inaczej , zawsze dobrze jest wiedzieć, jak to zrobić w , ponieważ byłoby to tym, co jest w funkcji. I nie, to nie jest rzadkie. Musisz tylko mieć ciągi ze spacjami, aby mieć bałagan. Wcale nie rzadkie. Jestem tam Dzięki za komentarz.^
symbol, aby rozpocząć wyszukiwanie od początku linii, ryzykujesz zmianę spacji w łańcuchach. Z^
gwarancją, że zmieniasz tylko spacje i tabulatory od początku linii, a tym samym wcięcie. Poza tym, jeśli jesteś pewien, że możesz zrobić wszystko naraz, usuń^
i uruchom tylko raz z::%s/\(^I*\)␣␣␣␣/\1^I/g
Tłumaczenie: Wyszukaj każdą instancję 4 kolejnych spacji (po znaku =), ale tylko wtedy, gdy cała linia do tego punktu jest spacją (używa to potwierdzenia zerowej szerokości,
\@<=
). Zastąp każde znalezione wystąpienie znakiem tabulacji.źródło
:%s/\(^\s*\)\@<= /\t/g
- umieść odpowiednią liczbę spacji (aby przekonwertować 4 spacje na 1 tab, wstaw 4 spacje) zaraz po<=
Zmienia wszystkie spacje na tabulator:% s / \ s / \ t / g
źródło
Linux: z
unexpand
(iexpand
)Oto bardzo dobre rozwiązanie: https://stackoverflow.com/a/11094620/1115187 , głównie dlatego, że używa * nix-utilities:
Linux: niestandardowy skrypt
Moja oryginalna odpowiedź
Fragment Bash do zamiany wcięcia 4- spacji (są dwa
{4}
w skrypcie) na tabulatory we wszystkich.py
plikach w./app
folderze (rekurencyjnie):Nie modyfikuje 4-spacji na środku lub na końcu.
Został przetestowany pod Ubuntu 16.0x i Linux Mint 18
źródło
W moim przypadku miałem wiele spacji (pola były oddzielone jedną lub więcej spacjami), które chciałem zastąpić tabulatorem. Zrobili to:
źródło
Jeśli zainstalowano coreutils GNU, należy rozważyć
%!unexpand --first-only
czy na kartach 4-przestrzeni, należy rozważyć%!unexpand -t 4 --first-only
(--first-only
występuje tylko w przypadku, gdy zostały przypadkowo powołującunexpand
się--all
).Zauważ, że zastąpi to tylko spacje poprzedzające określone tabulatory, a nie spacje, które za nimi podążają; nie zobaczysz żadnej różnicy wizualnej w vimie, chyba że będziesz wyświetlał zakładki bardziej dosłownie; na przykład moje
~/.vimrc
zawieraset list listchars=tab:▸┈
(podejrzewam, że dlatego myślałeś,unexpand
że nie działa).źródło
Aby użyć Vima do zmiany zestawu plików (np. Wszystkich plików * .ts w hierarchii katalogów) od powiedzmy 2 spacje do 4 spacji, możesz wypróbować to z wiersza poleceń:
Działa to w
find
celu przekazania wszystkich pasujących plików doxargs
(opcja -print0 w find działa z opcją -0 dla xargs w celu obsługi plików z / spacjami w nazwie).xargs uruchamia vim w trybie ex (
-e
) na każdym pliku, wykonując podaną komendę ex, która jest w rzeczywistości kilkoma komendami, aby zmienić istniejące początkowe spacje na tabulatory, zresetować tabulator i przestawić tabulatory z powrotem na spacje, a na koniec zapisać i wyjść.Uruchamianie w trybie ex zapobiega temu:
Vim: Warning: Input is not from a terminal
dla każdego pliku.źródło
Prosty skrypt w języku Python:
źródło