Czy jest polecenie w Vim / Vi, aby przesunąć kursor na koniec podświetlenia wyszukiwania?

85

Czy są jakieś polecenia w Vim / Vi do poruszania się w wybranym segmencie wyszukiwania?

Na przykład, jeśli szukam słowa, czy są jakieś polecenia, aby przesunąć kursor na koniec podświetlonego segmentu? Powiedz, że mam słowo „FishTaco” i chcę wyszukać wszystkie wystąpienia wyrażenia „Fish” i wstawić coś po nim. Wiem, że mógłbym dokonać globalnej zamiany, ale co jeśli chcę wprowadzić zmianę tylko w kilku niesekwencyjnych wystąpieniach?

Mogłem zobaczyć, gdzie byłoby wygodnie móc przesunąć kursor na koniec aktualnie podświetlonego segmentu, aby wykonać akcję.

Jordan Parmer
źródło
3
To nie jest odpowiedź na pytanie, ale aby osiągnąć swój ostateczny cel, jakim jest zastąpienie wszystkich Fishz FishTaco, można zrobić :%s/Fish\(Taco\)\@!/&Taco/, co znajdzie każdy Fishnie następuje już Tacoi zastąpić ją FishTaco. Łączy wyszukiwanie z wykluczającym wyprzedzeniem ze zmianą obejmującą dopasowany termin, po którym następuje Taco.
Jim Stewart,
@JimStewart Nie mam pojęcia, dlaczego ten komentarz nie ma co najmniej tylu + 1-ek, co odpowiedź. To jest vim na poziomie ninja.
Still.Tony

Odpowiedzi:

134

Możesz to zrobić w ten sposób:

/Fish/e

Na /ekońcu umieszcza kursor na końcu obszaru wyszukiwania (zamiast domyślnie pierwszego znaku.

Tim
źródło
32
Zauważ, że możesz dodać + n lub -n, aby umieścić kursor n znaków przed lub po końcu.
Nathan Fellman
10
Warto zauważyć, że po zakończeniu /Fishwyszukiwania możesz przeskoczyć do końca za pomocą //eiz Vima 7.4, którego możesz użyć gndo wizualnego podświetlenia znalezionego wyniku.
smathy
Spójrz również na odpowiedź @ghbarratt , więcej opcji lokalizowania kursora na podświetlonym dopasowaniu.
Nima
81

Jeśli chcesz po prostu umieścić kursor po ostatnim znaku Fish, możesz użyć

/Fish/e+1

co spowoduje umieszczenie kursora po h. (Bez +1kursora znajdzie się po lewej stronie ostatniego znaku).

Jeśli jesteś szczególnie zainteresowany umieszczeniem kursora po Fish, ale tylko wtedy, gdy pojawia się w „FishTaco”, możesz wypróbować jedną z następujących opcji:

Możesz użyć

/FishTaco/s+4

a kursor znajdzie się między Fish i Taco. /s+4Umieszcza kursor 4 miejsc po rozpoczęciu szukanej.

Możesz również użyć

/FishTaco/e-3

co spowoduje umieszczenie kursora w 3 miejscach na lewo od lewej strony ostatniego (końcowego) znaku.

Możesz także użyć

/FishTaco/b+4 

ponieważ /b+4będzie traktowane jako /s+4.

ghbarratt
źródło
13
Świetne wyjaśnienie, ale teraz jestem po prostu głodny.
kenny
27

Jeśli już szukałeś /Fish, możesz szybko zmienić wyszukiwanie, aby przejść do końca dopasowania przez //e, które powtarza ostatnie wyszukiwanie, ale dodaje emodyfikator, który został już wyjaśniony.

Ingo Karkat
źródło
1
numer // e + jest dokładnie tym, czego szukałem! niesamowite.
arkod
12

/ long-regexp1 \zs long-regexp2 / .. kursor zatrzyma się na \ zs , zobacz: help \ zs

mosh
źródło
11

Gdy masz już wizualną selekcję, możesz użyć, oaby przełączyć pozycję kursora między początkiem i końcem wybranego bloku. Kiedy zaznaczenie przebiega według linii, powoduje to przełączenie pozycji wiersza , co oznacza, że ​​kursor przesuwa się do początkowej i końcowej linii zaznaczenia, ale nie do znaku początkowego lub końcowego. Gdy wybór dotyczy znaków, ruch jest również zgodny z charakterem.

Możesz także użyć `<i, `>aby przełączać kursor między początkiem i końcem bloku wizualnego, jednak ma to wpływ na sam wybór, więc służy do resetowania lub dostosowywania granic zaznaczenia.

Edycja: Ach, ale w przypadku podświetlenia wyszukiwania to nie zadziała, ponieważ ozainicjuje wstawianie wiersza. Myślę, że podświetlenie wyszukiwania to nie to samo, co selekcja wizualna, przepraszam :)

kprobst
źródło
Tego też nie wiedziałem. Jest to świetne rozwiązanie do modyfikowania początku zaznaczenia bez rozpoczynania od nowa. (np. rozpocząłeś wybór o jedno słowo za wcześnie lub za późno)
Timothée Boucher
8

Część pytania „kursor na końcu dopasowania” została już udzielona.

Możesz to zrobić :%s/Fish/FishTaco/c. Daje to możliwość potwierdzenia lub odrzucenia każdej zamiany i pominięcia całego zadania „kursor na końcu dopasowania”.

romainl
źródło
Świetna wskazówka. Jeśli wpiszę „y”, zastąpienie dokona tylko pierwszego. Jak mam to potwierdzić dla każdego?
Jordan Parmer
1
Przechodzi do następnego dopasowania i czeka na wpisanie ylub ntak dalej, aż nie ma już żadnych dopasowań. Aby zaakceptować wszystkie dalsze podstawienia, wpisz a, aby je odrzucić, wpisz q.
romainl
1
Właściwie tęskniłem gza finałem, /więc nie było to kontynuowane w mojej linii. Dzięki za wskazówkę.
Jordan Parmer