Przejdź do następnego wystąpienia słowa, które właśnie zmieniłem


12

Jeśli mam następujące elementy:

function foo(bar) {
    return bar + 1;
}

I używam, cwaby zmienić pierwszy barna baz, jak przejść do następnego dopasowania bar, aby móc użyć .tej samej zmiany?

Nie mogę użyć *, ponieważ wyszukuje bieżące słowo pod kursorem, a głupio nie szukałem barpo raz pierwszy, więc nnie będzie działać.

Czy istnieje prosty sposób wyszukiwania następnego wystąpienia tego słowa, tak jak było przed jego zmianą?

I nie chcą zrobić wyszukiwania i zamiany, bo albo są inne występujące barw moim pliku, że nie chcesz zmienić, albo dlatego, że były tylko dwa przypadki bar, a ja zapomniałem o :%s/bar/baz/zanim zacząłem i że zbyt wiele wysiłku, aby zmienić jedyną pozostałą instancję.


2
Nie jest to całkowicie zgodne z opisanym przepływem pracy, ale vim-skośne usprawnia *wyszukiwanie. Zwłaszcza sprawia, że *wizualnie wybiera bieżące słowo bez poruszania kursorem. Po zainstalowaniu możesz zrobić, *ciwaby umieścić stare słowo w rejestrze wyszukiwania i zmienić słowo. Następnie możesz użyć ni ..
statox

Naciśnięcie n spowoduje przejście do następnego wystąpienia ostatnio wyszukiwanego wzoru. Dlaczego tego nie próbowałeś?
SibiCoder,

... ponieważ nie szukałem pierwszego wystąpienia, więc nnie będzie działać.
Roger Lipscombe,

Odpowiedzi:


14

Tekst, który właśnie zmieniłeś, cwzostał wycięty w rejestrze bez nazwy, dzięki czemu możesz go ponownie użyć za pomocą:

/<C-r>"<CR>

aby przejść do następnego wystąpienia tekstu objętego ostatnią zmianą.


5

Aby rozszerzyć romainl jako kompletny przepływ pracy ...

Jeśli wolisz wykonać tego rodzaju edycję, a potem zdajesz sobie sprawę, że musisz zastosować te same zmiany w akapicie / funkcji, której możesz użyć w rejestrach "i ..

W twoim przykładzie możesz wykonać początkową edycję argumentu. Jeśli przejdziesz do trybu wizualnego (użyję Visual Line tylko po to, aby upewnić się, że wszystko wybierzesz poprawnie), a następnie zastosuję wyszukiwanie i zamianę.

V]] - Linia wizualna do końca akapitu / funkcji.

  • : - Ponieważ jesteś w trybie wizualnym, staje się to :'<,'>
  • s/ - Odnaleźć
  • CTRL+ "- ostatni szarpnięcie / usunięcie elementu (pasek w przykładzie)
  • / - i Wymień
  • CTRL+ .- ostatnia wstawka (baz w przykładzie)

Przyzwyczajenie się do tego wzorca zajmuje trochę czasu, ponieważ musisz go użyć. Przez większość czasu chcesz po prostu zastosować wyszukiwanie i zastąpić całą funkcję łącznie z argumentem, ale jest to dobry sposób, aby nie wykonywać anty-wzorca „Wykonaj pracę, zdaj sobie sprawę, że powinieneś to zrobić lepiej, cofnij i powtórz poprawnie."


2

Jeśli nie masz nic przeciwko naciśnięciu innej kombinacji niż cw, wtedy uważam, że możesz łatwo uzyskać to, czego chcesz, definiując skrót. Co możesz zrobić, to umieścić następujące

nmap <leader>a "1yiw:let @/=@1^Mciw

w twoim .vimrcpliku. Zauważ, że ^M jest to przechwycenie klucza powrotu, a nie znaków ^i M. Możesz to zrobić, naciskając Ctrl+ Vw trybie wstawiania, a następnie Enter. Teraz, po zdefiniowaniu tego, naciśnięcie <leader>abędzie działało tak samo, jak cwteraz, ale teraz słowo (przed zmianą) będzie w twoim „rejestrze ostatniego wyszukiwania” (to znaczy /rejestrze), więc naciśnij npo dokonaniu zmiany i zwróceniu do trybu normalnego przeniesie Cię do następnego wystąpienia. Podobnie naciśnięcie Nspowoduje przejście do poprzedniego wystąpienia.

Skrót Możesz oczywiście wybrać inny skrót niż <leader>a, ale uważam, że jest to bardzo dostępny skrót. Osobiście mam ustawione <leader>na ,tak, że wystarczy nacisnąć ,a następnie a, ale to dlatego, że nie używam amerykańską klawiaturę, tak, że mój \jest ukryty nieco (wierzę \jest domyślnym <leader>).

Wyjaśnienie Pomysł jest naprawdę prosty. Podciągnij słowo pod kursorem do rejestru wyszukiwania, /a następnie wykonaj cw. Tak nmap <leader>a "/yciwwłaśnie dążyłem, ale niestety nie sądzę, że można szarpać do rejestru wyszukiwania, więc obejście polega na szarpnięciu słowa pod kursorem do 1rejestru, a następnie ustawieniu /rejestru tak, a następnie cw. Podobnie "1yiwczęść, która podciąga wewnętrzne słowo pod kursorem do rejestru 1. Jeśli nie wiesz o wewnętrznych słowach, możesz to sprawdzić :help iw. Następnie :let @/=@1przechwytywanie Enterumieszcza zawartość 1rejestru w /. W tym momencie niNdziała jako następne i poprzednie wystąpienie słowa pod kursorem, a następnie ciwjest wykonywane tak, że słowo pod kursorem jest usuwane, a Vim przechodzi w tryb wstawiania.

słowo kontra słowo wewnętrzne Właśnie zdałem sobie sprawę, że założyłem, że chcesz całe słowo pod curser, a nie tylko od curser i dalej. Dlatego użyłem iwzamiast wwszędzie. Jeśli tak nie jest, powinieneś użyć

nmap <leader>a "1yw:let @/=@1^Mcw

zamiast. Jeśli kursor znajduje się na pierwszej literze słowa, nie ma różnicy.

disclaimer Rozwiązanie to prawdopodobnie nie będzie działać dobrze, jeśli starają się używać go na coś, co zawiera rzeczy różni się od liter, na przykład poprzez podstawkę kursora na \lub przez zastąpienie iwprzez iW, ib, islub ipczy coś (choć nie wiem dlaczego byś chcesz tę funkcję z całymi zdaniami)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.