Dość często potrzebuję wykonania podstawienia, które będzie miało rozbieżne dopasowania w całym dużym pliku oraz z trywialnymi wyrażeniami wyszukiwania i zastępowania.
Powiedzmy na przykład, że mam kilka wywołań funkcji, takich jak okFunction(arg1, arg2 arg3)
. Argumenty będą się oczywiście różnić przy każdym wywołaniu funkcji. Teraz powiedz, że odkryłem lepszą funkcję, która nie potrzebuje arg2
. Mogę łatwo dostosować cały plik za pomocą
:%s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/gc
Chociaż koncepcyjnie prosty, nie jestem pewien, czy mam prawidłową składnię w tym dość długim wzorcu. c
Flaga naprawdę pomaga tutaj, ale problemem jest to, że kiedy z prośbą o potwierdzenie, vim nie pokaże, co mecz zostanie zastąpiony. To znaczy, pokaże wyrażenie zastępujące, ale nie oceniany wynik. Jeśli potwierdzę zmianę y
, vim natychmiast przejdzie do następnego meczu i nie będę mógł sprawdzić, czy popełniłem jakieś błędy.
Znalazłem wtyczkę vim-over, która częściowo rozwiązuje problem, ale tylko wtedy, gdy wszystkie maty są widoczne na ekranie podczas wpisywania polecenia. Po wciśnięciu klawisza Enter zachowanie jest dokładnie takie samo, jak opisałem powyżej i nie otrzymuję podglądu.
Czy jest więc sposób, aby uzyskać vima do oceny wyrażenia zastępującego, gdy prosi o potwierdzenie poleceń zastępczych?
źródło
%
, sprawdź, czy wynik jest tym, czego się spodziewałem, a następnie użyj podstawienia za pomocą%
(to tylko kilka naciśnięć klawiszy:):<up><c-b>%
. Oczywiście opcja podglądu byłaby znacznie bardziej wydajna. Chociaż żadna łatka nie jest dostępna, być może można by łączyć podstawienie w funkcji vimscript z tego rodzaju opcją, ale to brzmi jak dużo pracy ...Odpowiedzi:
Jednym obejściem są makra. Podświetl wszystkie obszary problemowe i dokonuj zamiany na jednej linii na raz. Następnie zdecyduj, czy chcesz, czy nie. Po zakończeniu
n
do następnego obszaru.W konkretnym przypadku:
/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))
qq
.:s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/g
q
u
) lub przejdź do następnego wyniku wyszukiwania (n
).@q
.Oczywiście nie do końca to, czego szukałeś, ale zwykle to robię.
źródło
/
, zachowuje się również jako selekcja wizualna - fajnie./
... zachowuje się jak selekcja wizualna." W rzeczywistości tak nie jest. Powodem, dla którego to działa, jest to, że:s//
działa na bieżącej linii, a użycien
powoduje przejście do następnego wystąpienia.:s/pattern/replacement
, użyje on ostatniego ciągu wyszukiwania, więc w kroku 3 możesz faktycznie złożyć wniosek:s//betterFunction(\1, \3)/g
o zapisanie części tekstu.:vimgrep /pattern/ ##
a następnie stosuję makro , w ten sposób, jeśli okaże się, że mój wzór jest właściwie zgodny, a makro jest zbyt żmudne, mogę wtedy szybko przywrócić:argdo %s/.../..../gc
i rozpocząć pływające po operacji