Chcę stworzyć podstawowy skrypt Vima, który po prostu usuwa n wierszy, pomija 1 wiersz i powtarza do końca dokumentu. Nie dbam o konkretne dopasowania, chcę po prostu usunąć linię. Na przykład; Chcę więc powtórzyć polecenie 3ddj
dla całego dokumentu.
Text I want to keep.
Text I want to delete.
Text I want to delete.
Text I want to delete.
Text I want to keep.
Text I want to delete.
Text I want to delete.
Text I want to delete.
Text I want to keep.
Text I want to delete.
Text I want to delete.
Text I want to delete.
Wygląda to na ...
Text I want to keep.
Text I want to keep.
Text I want to keep.
Dziękuję Ci.
regular-expression
normal-mode
repeated-commands
Max Copley
źródło
źródło
regular-expression
w swoim pytaniu, ale wydaje się, że pytanie nie określa powodu, dla którego należy to zrobić za pomocą wyrażeń regularnych. Jeśli faktycznie szukasz czegoś, co korzysta z wyrażeń regularnych, to stackoverflow.com/questions/17735289/... może być interesujące. To pytanie dotyczyło Notepad ++, ale w odpowiedzi użyto tylko wyrażenia regularnego pcre. (Zastrzeżenie: Napisałem tę odpowiedź.)Odpowiedzi:
Bardzo proste podejście:
qa3ddjq
Krok trzeci powtórzy makro tysiąc razy lub do momentu wystąpienia błędu. Wciśnięcie końca pliku (stąd brak wierszy do usunięcia) powoduje błąd, a powtórzenie makra jest anulowane.
Zobaczyć
:help recording
.źródło
q
(w trybie komend, w vimie lub innych najnowszych wersjach alternatywnych [neovim itp.], ale nie w oryginalnym vi) oznacza „rozpocznij nagrywanie i umieść go w buforze„ następnej litery ”. stąd:qa
oznacza „rozpocznij nagrywanie w buforze„ a ”. Następnie wszystkie klawisze wpisane po tym (do następnegoq
w trybie poleceń) są zapisywane (możesz nawet nagrywać: przejście do trybu edycji, wpisanie czegoś, przejście do trybu poleceń itp.). Następnie12@a
powtórzyłby wszystkie działania zapisane w buforze „a” 12 razy.1000@q
na końcu, możesz utworzyć makro rekurencyjne:qa3ddj@aq@a
chociaż może zajść potrzeba,qaq
aby upewnić się, że"a
zaczyna się od pustego.Najłatwiejszym rozwiązaniem byłoby dla mnie:
To jest:
%
: dla każdej liniinorm
: uruchom następujące klawisze, jak w trybie normalnymj3dd
: zejdź na dół, a następnie usuń 3 linieWięc od pierwszego wiersza zejdź do drugiego i usuń kolejne 3 wiersze. Drugi
Text I want to keep.
jest teraz na drugiej linii. Przejdź w dół o jedną linię, usuń 3. Opłucz i powtórz.Uwaga: jeśli nie chcesz przetwarzać całego pliku, możesz go zastąpić
%norm
np.5,$norm
Aby przetworzyć od 5. linii do końca pliku.źródło
Masz już kilka świetnych rozwiązań. Oto kolejny:
Najpierw wykonujemy akcję na każdej linii (
:g
dopasowując do^
(początku linii)) i dla każdego numeru linii wykonujemy wyniklinenumber % 4
. Jeśli wynik jest nierówny1
, dodajemyDELETE ME
na początku linii, zaznaczając linie do usunięcia za pomocą następnego polecenia.Następne polecenie to polecenie regularne (
:g
), które pasuje do wszystkich linii, które zaczynają się od niego,DELETE ME
i robi to.Uwaga: Nie można natychmiast usunąć linii za pomocą pierwszego
:g
polecenia, ponieważ zmieniłoby to wynikowe obliczenia modulo i jako takie musimy najpierw zaznaczyć linie, a w drugim etapie usunąć je.źródło
Wiem, że to jest
vi
kanał, ale dla mnie tosed
problem.Możesz więc wdrożyć go do
vi
rozwiązania:źródło
Alternatywa (przypuszczam, że zaczynamy od linii 1 i usuwamy linie 2-4, 6-8 itd., Jak w przykładowym tekście):
Jeśli wolisz robić to interaktywnie, możesz skorzystać z „rejestru wiersza poleceń”. To znaczy naciśnij
:+1del 3<CR>
i wtedy1000@:
źródło
alternatywa: chcesz zachować dowolne wiersze: 1, 4 itd. Możesz użyć:
inna alternatywa: jeśli znasz linie, które chcesz dopasować do jakiegoś unikalnego wzoru:
źródło