Jak mogę przekonwertować spacje na tabulatory w Vimie lub Linuksie?
Przejrzałem kilka pytań dotyczących przepełnienia stosu, aby dowiedzieć się, jak konwertować spacje na tabulatory bez znajdowania tego, czego potrzebuję. Wydaje się, że jest więcej pytań dotyczących konwersji tabulatorów na spacje, ale staram się zrobić odwrotnie.
W Vim
próbowałem :retab
i :retab!
bez powodzenia, ale wierzę, że są one rzeczywiście do przechodzenia z tabulatorów do spacji.
Próbowałem zarówno expand
jak i unexpand
w wierszu polecenia bez powodzenia.
Oto plik w pytanie:
Jak przekonwertować spacje wiodące na tabulatory używając Vim
lub powłoki?
6 answers
Użycie Vima do rozszerzenia wszystkich wiodących spacji (szerszych niż 'tabstop'
), miałeś rację, że użyłeś retab
ale najpierw upewnij się 'expandtab'
is reset (:verbose set ts? et?
jest twoim przyjacielem). retab
przyjmuje Zakres , więc zwykle określam %
to znaczy "cały plik".
:set tabstop=2 " To match the sample file
:set noexpandtab " Use tabs, not spaces
:%retab! " Retabulate the whole file
Przed zrobieniem czegoś takiego (szczególnie z plikami Pythona!), Zwykle ustawiam 'list'
, tak, że mogę zobaczyć białe znaki i zmienić.
Mam po mapowaniu w mój .vimrc
za to:
nnoremap <F2> :<C-U>setlocal lcs=tab:>-,trail:-,eol:$ list! list? <CR>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-22 08:49:10
1 - Jeśli masz spacje i chcesz tabulatory.
Najpierw musisz zdecydować, ile spacji będzie miała jedna karta. Załóżmy, że masz linie z wiodącymi 4 spacjami lub 8... Niż zdajesz sobie sprawę, że prawdopodobnie chcesz, aby karta była 4 spacje. Teraz z tą informacją robisz:
:set ts=4
:set noet
:%retab!
Jest problem! Ta sekwencja poleceń będzie szukać całego tekstu, a nie tylko spacji na początku linii. Oznacza to, że ciąg w stylu: "Hey,␣this␣␣␣␣is␣4␣spaces"
stanie się "Hey,␣this⇥is␣4␣spaces"
, ale nie jest! its a tab!.
Aby rozwiązać ten mały problem polecam search
, zamiast retab
.
:%s/^\(^I*\)␣␣␣␣/\1^I/g
To wyszukiwanie będzie szukać w całym pliku dowolnych linii zaczynających się od dowolnej liczby tabulatorów, a następnie 4 spacji i zastąpi je dowolną liczbą 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 następnie przekonwertuje tylko pierwsze 4 spacje na kartę i niech podążam...
Musisz powtórzyć polecenie. Ile razy? Dopóki nie dostaniesz pattern not found
. Nie mogę jeszcze wymyślić sposobu na automatyzację procesu. Ale jeśli tak:
`10@:`
Prawdopodobnie skończyłeś. To polecenie Powtarza ostatnie wyszukiwanie / zamianę 10 razy. Nie jest prawdopodobne, że twój program będzie miał tak wiele wcięć. Jeśli tak, po prostu powtórz jeszcze raz @@
.
2 - masz karty i chcesz spacje.
Najpierw zdecyduj, na ile spacji chcesz przekonwertować tabulatory. Powiedzmy, że każda karta ma być 2 spacjami. Wtedy robisz:
:set ts=2
:set et
:%retab!
To miałoby ten sam problem z łańcuchami. Ale jako jego lepszy styl programowania, aby nie używać twardych tabulatorów wewnątrz ciągów, faktycznie robisz dobrą rzecz tutaj. Jeśli naprawdę potrzebujesz zakładki wewnątrz łańcucha, użyj \t
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-24 16:17:05
:%s/\(^\s*\)\@<= /\t/g
Tłumaczenie: wyszukuje każdą instancję 4 kolejnych spacji (po znaku=), ale tylko wtedy, gdy cała linia do tego punktu jest białą spacją(używa się twierdzenia zerowej szerokości look-behind, \@<=
). Zastąp każdą znalezioną instancję znakiem tabulacji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-23 20:53:01
Zmienia wszystkie spacje na tabulator : %s/\S/\T / G
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-28 07:30:17
Fragment Basha do wymiany 4-wcięcia spacji (w skrypcie są dwa {4}
) z tabulatorami we wszystkich plikach .py
w folderze ./app
(rekurencyjnie):
find ./app -iname '*.py' -type f \
-exec awk -i inplace \
'{ match($0, /^(( {4})*)(.*?)$/, arr); gsub(/ {4}/, "\t", arr[1]) }; { print arr[1] arr[3] }' {} \;
Nie modyfikuje 4-spacji w środku ani na końcu.
Został przetestowany pod Ubuntu 16.0 X i Linux Mint 18
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-16 05:55:18
Prosty Skrypt Pythona:
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()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-02 12:25:30