W vim czasami mam okazję zastąpić kilka pierwszych wystąpień dopasowania na linii, ale nie każdy g
chciałby. na przykład:
a a a a a
do
b b b a a
Wiem, że mógłbym użyć :s/a/b/[enter]:[up][enter]:[up][enter]
, ale to dość nużące przy trzech powtórzeniach, mam linie z potencjalnie 10+ podstawieniami.
Próbowałem:
:s/a/b/3g
: vim narzekał na końcowe znaki.:s/a/b/3
: zmienia pierwsze wystąpienie w tym i kolejnych dwóch wierszach.3:s/a/b
: tak samo jak poprzednio.:s/a/b/g3
: zmienia wszystkie wystąpienia tego i następnych dwóch wierszy.:3s/a/b
: zmienia pierwsze wystąpienie w linii 3.:/a/,3/a/s/a/b
: zmienia pierwsze wystąpienie w każdej linii między kolejnąa
a trzecią linią zawartąa
w pliku (w razie potrzeby monit o cofnięcie).:/a/,/\([^a]*a\)\{3\}/s/a/b/
: zmienia pierwsze wystąpienie w każdym wierszu między tym a następnym z 3a
s (i nie byłoby to łatwe do rozszerzenia na wyszukiwanie wielu znaków).
I różne inne wzorce adresowania, z których żaden nie działał. Muszę powiedzieć, że sporo się dowiedziałem o :s
poleceniu, które próbuje znaleźć odpowiedź na ten problem, ale nadal go nie rozwiązałem.
Czy ktoś wie jak to zrobić?
(punkty bonusowe za określony zasięg, np. od drugiego do czwartego wystąpienia)
n
i.
chociaż nie pomyślałem, aby ich tutaj użyć. Z pewnością poprawa, dzięki.s/a/=something/
powinien wykonać trick (:help sub-replace-=
). Nie jestem wystarczająco biegły w Vimie, żeby pisaćsomething
od razu.:[up][enter]
można go zastąpić&
, co wciąż nie jest idealne, ale przynajmniej jest mniej bolesne.Odpowiedzi:
Opierając się na
:s/pattern/replacement/gc
pomyśle z Samus_ (który wydaje się być najprostszym sposobem na zapewnienie poprawnego działania, gdy wzorzec jest zawarty w ciągu zastępującym), aby zamienić 2–4 wystąpienie w jednym wierszu:feedkeys()
to funkcja, która wpycha ciąg wejściowy do kolejki wprowadzania na klawiaturze. Chodzi o to, aby zliczyć z góry, abyś nie musiał się martwić utratą liczenia lub przerwaniem.W przypadku bardziej ogólnym przypadku, wymienić mc przez N-te zdarzenia w jednej linii dla N większy niż lub równy bardzo dużej M :
Zamień M i N na żądane wartości (możesz nawet pozwolić
vim
na trywialną arytmetykę mentalną, jeśli nie chcesz tego zrobić sam). Zauważ, że.
jest to operator konkatenacji ciągów VimL. Oczywiście to tylko oszczędza klawiszy dla dużych M . Jeśli często korzystasz z tej funkcji, możesz zaoszczędzić czas na umieszczenie powyższego polecenia w niestandardowej komendzie lub funkcji, ponieważ wpisywanie jest dość trudne.źródło
W przypadku pierwszego pytania chciałbym:
Drugi jest trudniejszy, nie wiem, jak to zrobić automatycznie, ale możesz sprawić, by vim wyświetlał monity przy każdym meczu w następujący sposób:
Następnie odpowiadasz „nie” na pierwsze n dopasowań, a „tak” na pozostałe.
źródło
c
, że to może być najlepsze zaproponowane rozwiązanie. Wciąż musiałbym liczyć, ale myślę, że to pierwsza opcja, która działałaby z zamiennikami zawierającymi wyszukiwany ciąg.źródło
Myślę, że to może zadziałać, najpierw wymień, a następnie powtórz 2 razy:
źródło