Mam kilka kodów skopiowanych z Internetu, które mają wcięcia 2-spacyjne i chcę to zmienić na wcięcie 4-spacyjne. Zastanawiam się, czy istnieje krótka procedura Vima do wykonania zadania bez konieczności pisania skryptu vim? Oto jak obecnie robię to z plikiem HTML:
- Zarejestruj makro
- Idź na początek wiersza
- Wizualne zaznaczanie wszystkich białych znaków aż do pierwszego wystąpienia „<”
- Yank i wklej wszystkie białe spacje (w zasadzie aby je podwoić)
- Powtórz makro do końca pliku
W skrócie qa0vt<yp<esc>jq
Pułapki:
Makro kończy się niepowodzeniem w przypadku pustego wiersza lub wiersza, który nie zaczyna się od „<”. I nie mam pojęcia, jak rozszerzyć to rozwiązanie na plik inny niż HTML.
ts
: =tabstop
,sts
: =softtabstop
i[no]et
: =[no]expandtab
.retab
argument byłby przydatny i dlaczego nie możemy go użyć do tego zadania?:set sts=2 noet
i:retab! 2
tak byłoby nieco krótszy (choć może mniej czytelny), że sposób.:set ts=2 sts=2 noet | retab! | set ts=4 sts=4 et | retab!
a następnie użyj@:
w różnych plikach, aby szybko wykonać tę samą akcję.Może to być możliwe dzięki
:set shiftwidth=4
igg=G
.źródło
gg=G
znaczy dokładnie? Rozumiem, żegg
oznacza to „przejdź do 1,1” iG
„przejdź do ostatniej linii”.=
wykonuje wcięcia, więc oznacza to po prostu wcięcie od początku do końca tekstu%retab
, które nieprawidłowo konwertowało spacje osadzone w literałach ciągów.To, co robię, jest bardzo podobne do podejść esneidera i cforbisha, ale trochę szybciej wpisuję:
Po prostu zastępuje wiodące spacje (spacje lub tabulatory) dwukrotnie większą spacją (
&
jest zastępowane dopasowanym wyrażeniem).źródło
%
.sed
i zastosować do wszystkich plików w katalogu superuser.com/a/159286/41494Użyłem tego wyrażenia regularnego (podwaja liczbę wiodących spacji):
źródło
%s/\s\+/&&/
robi tego samego? Btw, myślę, żeg
flaga jest niepotrzebna (po pierwsze, byłby tylko 1 mecz z^pattern
w każdej linii, nie?)%s/^\s\+/&&/g
jest bliżej.To jest bardzo stare pytanie, jednak wszystkie odpowiedzi są ... błędne ... Vim ma bardzo łatwy sposób na przywrócenie całego pliku. Nauczyłem się tego po napisaniu własnej funkcji, aby to zrobić, więc jestem na tej samej łodzi ignorancji;)
rodzaj
to przy założeniu, że masz ustawioną tabulator na to, co lubisz (więc dla OP będzie to ts = 4)
Dowiedziałem się tego z http://vim.wikia.com/wiki/Fix_indentation , o którym wspomina
źródło
Podobne (ale nieco prostsze) do odpowiedzi cforbisha, to wyrażenie regularne powiela początkowe spacje
Lub możesz użyć tego innego wyrażenia regularnego, aby przekształcić 2 spacje w 4 spacje, zachowując pojedyncze spacje (i ogólnie nieparzyste ilości)
To jest,
źródło
Oprócz odpowiedzi @ spro umieściłem to w moim
.vimrc
Po prostu wpisz
:Format
.W przypadku wyboru wizualnego formatuje to tylko wybrane linie.
Bez selekcji wizualnej formatuje to cały plik.
źródło
To jest wariant odpowiedzi opartych na wyrażeniach regularnych.
Mam skrypt bash w moim lokalnym katalogu bin, który podwoi ilość białych znaków na początku wiersza. Wejście może być stdin lub plikiem:
Używam tego w Vimie, wizualnie wybierając linię i wydając następujące polecenie:
Oszczędza mi to potrzeby wpisywania (lub zapamiętywania) wyrażenia regularnego.
Używam go również w mapach takich jak:
co spowoduje zastosowanie go do bloku ostatnio wklejonego tekstu. Zwykle używam następującej mapy do wklejania zamiast
:set paste
Mój typowy przepływ pracy to:
lub po prostu zmieniając wcięcie na szarpanych blokach wklejonych z innego bufora.
źródło