1 - Pokud máte mezery a chcete tabulátory.
Nejprve se musíte rozhodnout, kolik míst bude mít jednu kartu. To znamená, že předpokládejme, že máte řádky s úvodními 4 mezerami nebo 8... Pak si uvědomíte, že pravděpodobně chcete, aby tabulátor měl 4 mezery. Nyní s těmito informacemi uděláte:
:set ts=4
:set noet
:%retab!
Tady je problém! Tato sekvence příkazů vyhledá veškerý váš text, nejen mezery na začátku řádku. To znamená řetězec jako:"Hey,␣this␣␣␣␣is␣4␣spaces"
bude "Hey,␣this⇥is␣4␣spaces"
, ale není! je to karta!.
K vyřešení tohoto malého problému doporučuji search
, namísto retab
.
:%s/^\(^I*\)␣␣␣␣/\1^I/g
Toto vyhledávání vyhledá v celém souboru všechny řádky začínající libovolným počtem tabulátorů, po nichž následují 4 mezery, a nahradí je libovolným počtem nalezených tabulátorů plus jedna.
Toto bohužel nepůjde spustit najednou!
Nejprve bude mít soubor řádky začínající mezerami. Vyhledávání pak převede pouze první 4 mezery na tabulátor a následující...
Musíte příkaz zopakovat. Kolikrát? Dokud nezískáte pattern not found
. Zatím mě nenapadá způsob, jak proces automatizovat. Ale pokud to uděláte:
`[email protected]:`
Pravděpodobně jste skončili. Tento příkaz 10krát zopakuje poslední hledání/nahrazení. Není pravděpodobné, že váš program bude mít tolik odrážek. Pokud ano, opakujte znovu @@
.
Teď už jen dokončit odpověď. Vím, že jste žádali o opak, ale nikdy nevíte, kdy potřebujete věci vrátit zpět.
2 - Máte tabulátory a chcete mezery.
Nejprve se rozhodněte, na kolik prostorů chcete karty převést. Řekněme, že chcete, aby každá karta měla 2 mezery. Poté provedete:
:set ts=2
:set et
:%retab!
To by mělo stejný problém s řetězci. Ale protože je lepší programovací styl nepoužívat tvrdé tabulátory uvnitř řetězců, děláte tu vlastně dobrou věc. Pokud opravdu potřebujete tabulátor uvnitř řetězce, použijte \t
.
Pomocí Vimu rozbalte všechny hlavní mezery (širší než 'tabstop'
), měli jste pravdu, když jste použili retab
ale nejprve se ujistěte, že 'expandtab'
je resetováno (:verbose set ts? et?
je tvůj přítel). retab
zabírá rozsah , takže obvykle uvádím %
znamená "celý soubor".
:set tabstop=2 " To match the sample file
:set noexpandtab " Use tabs, not spaces
:%retab! " Retabulate the whole file
Než udělám něco takového (zejména se soubory Pythonu!), obvykle nastavím 'list'
, abych viděl mezery a změny.
V mém .vimrc
mám následující mapování pro toto:
nnoremap <F2> :<C-U>setlocal lcs=tab:>-,trail:-,eol:$ list! list? <CR>