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:

Http://gdata-python-client.googlecode.com/hg-history/a9ed9edefd61a0ba0e18c43e448472051821003a/samples/docs/docs_v3_example.py

Jak przekonwertować spacje wiodące na tabulatory używając Vim lub powłoki?

Author: DarthPaghius, 2012-02-02

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>
 244
Author: Johnsyweb,
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 @@.

Teraz, żeby uzupełnić odpowiedź. Wiem, że prosiłeś o coś przeciwnego, ale nigdy nie wiesz, kiedy trzeba cofnąć rzeczy.

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.

 27
Author: Dr Beco,
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.

 11
Author: Simon Zuckerbraun,
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

 1
Author: murat budak,
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

 0
Author: maxkoryukov,
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()
 -1
Author: Michael W.,
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