Po pierwsze, ponieważ jest to mój pierwszy post tutaj, chciałbym tylko powiedzieć, że VIM jest świetnym narzędziem, a forum tutaj bardzo pomocne w znajdowaniu odpowiedzi na pytania, z dużą ilością pomocnych osób nieoceniona pomoc. Nadal jestem bardzo nowy w VIM, więc prawie wszystko, czego się o nim dowiedziałem, pochodzi.
Moje pytanie brzmi: wiem, jak odwrócić WSZYSTKIE linie w pliku (między innymi: g / ^ / m0), ale czy istnieje sposób na odwrócenie co 4 linie w pliku, tak aby
line1
line2
line3
line4
line5
line6
line7
line8
...
staje się
line4
line3
line2
line1
line8
line7
line6
line5
...
Możesz założyć, że w takich plikach zawsze będzie dokładna wielokrotność 4 linii.
Odpowiedzi:
Można do tego użyć komendy
:Reverse
objaśnionej na Vim Wiki (możesz włączyć ją do swojej,.vimrc
aby była stała):Następnie możesz nagrać makro, aby uruchomić polecenie co cztery linie:
Wyjaśnienie:
qm
: „q” w trybie normalnym rozpoczyna (i zatrzymuje) rejestrowanie makra w danym rejestrze (w tym przypadku zarejestruj „m”, ale może to być dowolna inna litera)V
: wejdź w tryb wizualny i wybierz bieżącą linię3j
: rozwiń zaznaczenie wizualne do następnych 3 linii:Reverse<cr>
: uruchom polecenie Odwróć w wybranych liniach (<cr>
tutaj oznacza enterklawisz)4j
: przejdź do następnych niezmienionych liniiq
: zatrzymuje rejestrowanie makra1000@m
: uruchom makro zarejestrowane w rejestrze „m” 1000 razy (możesz zwiększyć tę liczbę, jeśli plik ma więcej niż 4000 linii)Edytować:
Jak wspomniano w komentarzach, możesz użyć makra rekurencyjnego zamiast liczenia:
qM
: jeśli rejestr podany jakoq
wielka litera, makro jest dołączane do rejestru (jest to również przydatne, gdy zauważysz, że przegapiłeś ostatnie kroki na złożonym makrze)@m
: uruchom makro przy rejestracjim
q
: przestań dodawać makroPomimo tego, że jest tworzony jako makro, możesz utworzyć dla niego komendę, jeśli jest to typowe zadanie w twoim przepływie pracy:
function! Reverse4()
/endfunction
: definiuje nową funkcjęlet reg_m = @m
: zapisuje bieżącą zawartość rejestrum
let @m = "<c-r><c-r>m"
: wstaw makro do rejestrum
- zwróć uwagę, że<c-r>
jest to notacja vim dla Ctrl+ ri że powinieneś to wpisać , a nie kopiować / wklejać, więc twoja linia będzie podobnalet @m = 'V3j:Reverse^M4j@m'
i będzie zawierała znak specjalny (^ M)normal! @m
: normalne polecenie uruchamia swój argument, ponieważ zostało wpisane w trybie normalnym, więc uruchomi makro rekurencyjnelet @m = reg_m
: przywraca zawartość rejestrum
, więc nie musisz pamiętać, że ten rejestr jest używany w tej funkcji i unikaj jego używaniacommand! Reverse4 call Reverse4()
: utwórz nowe polecenie dla tej funkcjiW zależności od potrzeb możesz go ulepszyć, np .: przekazać argument do polecenia i funkcji, aby działał dla dowolnej liczby linii zamiast być ustalony w grupach po 4 linie.
źródło
1000@q
siekać, można również użyć makra rekurencyjnego:qmqqm ... @mq@m
.command! -bar -range=% Reverse <line1>,<line2>g/^/m<line1>-1|nohl
gdzieś w vimrc.Podobnie jak w przypadku wszystkich powtarzających się czynności , jeśli możesz zrobić coś raz za pomocą podstawowych operacji edycji, możesz to zrobić wiele razy, rejestrując makro.
(W tym przypadku użyję makra rekurencyjnego, ale możesz po prostu nagrać makro nierekurencyjne i odtworzyć je wiele razy młotkiem
@@
lub za pomocą liczenia).Zepsuty
gg
: Przejdź na początek pliku.qqq
: Wyczyść rejestrq
. Zobaczymy, dlaczego jest to konieczne w kroku 5.qq
: Rozpocznij rejestrowanie makra, aby zarejestrować qddjjpkddkkPjddpjj
: Seria operacji, która zmienia kolejność pierwszych czterech wierszy po prostu usuwając je i wklejając ręcznie. (To może wyglądać na pierwszy rzut oka skomplikowane, ale nie daj się zwieść Jest to bardzo podstawowe rzeczy, które chcesz nauczyliśmy w ciągu pierwszych 5 minut albo tak.vimtutor
:j
,k
,dd
,p
,P
)@q
: Wywołaj makro! W tym momencie rejestrq
nie zawiera niczego (ponieważ wyczyściliśmy go w kroku 2), więc nic się nie stanie.q
: Zatrzymaj rejestrowanie makra.@q
: Odtwórz makro rekurencyjne tyle razy, ile to konieczne.Uwaga: Powyższe nie przyniesie pożądanych rezultatów, jeśli plik zawiera szereg linii, których nie da się dokładnie podzielić przez cztery. Aby zatrzymać makro wcześnie, jeśli nie pozostały już cztery wiersze, musimy wykonać polecenie trybu normalnego Vima, które zakończy się niepowodzeniem, zanim zaczniemy wprowadzać zmiany w kroku 4. Możemy to zrobić, próbując przejść w dół linię trzy razy (a następnie cofnij), zanim zaczniemy przesuwać linie:
jjj3k
A zatem:
źródło
q
musi być puste, w przeciwnym razie zepsuje edycje.qqqggqqjjjkddkkPjddjpkddkkPjjjj@qq@q
where I can just use the one-line custom command each time I need to do this
- pamiętaj, że nie trzeba ponownie tworzyć makra za każdym razem, gdy trzeba go użyć, ponieważ można go zapisać jako funkcję / polecenie w vimrc.Możesz to również zrobić za pomocą
Ex
polecenia używanegosed
jako filtr zewnętrzny:Ta wersja zignoruje (usunie) wszelkie dodatkowe wiersze poza wielokrotnością 4. Aby pozostać w ostatnim zestawie mniej niż 4 wiersze (odwrócone), użyj:
%
Tutaj oznacza „każda linia w buforze.”Te
!
środki polecenia „Uruchom następujące polecenie z określonymi liniami jako wejście, a zastąpić określone wiersze z wyjściem polecenia.” (Nazywa się to filtrem; bardzo przydatny do takich rzeczy jak sortowanie, np.:%!sort
Sortuje wszystkie linie w twoim pliku;:2,8!sort
sortuje linie 2-8 itp.)sed
jest narzędziem do edytowania strumieni i można go znaleźć we wszystkich systemach uniksopodobnych. Kluczowymi pojęciamised
stosowanymi tutaj są „przestrzeń wzorca” (która domyślnie zawiera po prostu każdy wiersz danych wejściowych po kolei) oraz „przestrzeń wstrzymania” (gdzie można wstawić dodatkowy tekst, używając gosed
do zapisania go podczas przetwarzania innych wiersze wprowadzania).-n
jest opcją dlased
polecenia, aby ukryć jego domyślne działania drukowania przestrzeni wzorców (ponieważ w tym przypadku chcemy drukować tylko wtedy, gdy wyraźnie to mówimy).$p
wsed
poleceniu oznacza „Jeśli znajdujesz się w ostatnim wierszused
wejścia, wydrukuj (przestrzeń wzorów).”h
oznacza „przykleić bieżącą zawartość„ przestrzeni wzorów ”do„ przestrzeni wstrzymania ”, zastępując wszystko, co tam jest”.n
oznacza „zamień zawartość„ przestrzeni wzorów ”na następny wiersz z danych wejściowych.”G
oznacza „dołącz do„ przestrzeni wzorów ”: nowa linia, po której następuje treść„ przestrzeni wstrzymania ”.Podsumowując,
sed
polecenie przechowuje cztery wiersze danych wyjściowych, odwracając je podczas przechowywania, a następnie drukuje. Te$p
polecenia dodane w drugiej wersji zapewniają, że jeśli ostatni wiersz pliku zostanie osiągnięty inny niż na wielokrotność 4 linie, linie są nadal drukowane.Dla alternatywnego, interaktywnego podejścia wciąż bez użycia funkcji specyficznych dla Vima, a także bez użycia zewnętrznego filtra:
przejść do czwartej linii.
aby odwrócić poprzednie cztery linie (1-4) i pozostawić kursor w linii 8.
.m -4
przesuwa bieżącą linię do tuż po linii cztery linie wstecz (pozostawiając kursor na przesuniętej linii).+3m .
przesuwa linię, która jest 3 linie za bieżącą linią, tuż za bieżącą linią, pozostawiając kursor na przesuniętej linii.+2m .
oczywiście działa tak samo.+5
ustawia kursor pięć linii w dół od miejsca, w którym się znajduje.Powtórz w razie potrzeby.
W Vimie możesz powtórzyć to polecenie za pomocą
@:
, a następnie powtórzyć za pomocą@@
. W POSIXvi
lubex
ciebie musiałby włożyć:.m -4 | +3m . | +2m . | +5
w postaci linii tekstu, usuń ją do określonego bufora (rejestru), a następnie wykonać tę nazwie bufora (rejestr).Tak więc w
ex
trybie interaktywne odwracanie wierszy tylko przy użyciu funkcji określonych przez POSIX i rozpoczynanie od 17 wierszy tekstu:Dalsza lektura:
ex
vi
źródło
4G:.m -4 | +3m . | +2m . | +5<Enter>@:
następnie@@
powtarzaj, aż plik zostanie w pełni przetworzony. Polecam jednak instalację MobaXterm. :)Zwykły angielski: Dla każdej linii przesuń bieżącą linię w górę
lnum % 4
, chyba żelnum % 4 == 0
w takim przypadku przesuń bieżącą linię w górę4
.Ponadto, aby odwrócić wszystkie
n
linie, zamień4
's w powyższym poleceniu nan
.źródło