Jak uzyskać podgląd polecenia zamiany?

9

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. cFlaga 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?

Vitor Eiji
źródło
2
to jest lista whishlist w narzędziu do śledzenia błędów vim (przepraszam, nie znajduję go obecnie)
Christian Brabandt
2
Aby uzyskać wartość, zwykle używam podstawienia w pierwszym wierszu, aby zastąpić bez %, 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 ...
statox
2
@ChristianBrabandt Znaleziono . To jak dotąd z niesklasyfikowanym priorytetem ...
Vitor Eiji
2
@VitorEiji, nie o tym myślałem. Ale to tak naprawdę nie ma znaczenia, ponieważ obecnie nie jest to możliwe. Neovim zapewnia opcję „polecania”, która może działać (lub nie, tak naprawdę nie teraz)
Christian Brabandt
Zło podgląda zamianę; Ale nie wiem jak to robi.
Geremia

Odpowiedzi:

2

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 ndo następnego obszaru.

W konkretnym przypadku:

  1. Wyszukaj obszary: /\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))
  2. Rozpocznij rejestrowanie makra qq.
  3. Zastosować :s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/g
  4. Zatrzymaj rejestrowanie makra q
  5. Cofnij ( u) lub przejdź do następnego wyniku wyszukiwania ( n).
  6. Zastosuj makro @q.
  7. Powtórz kroki 5 i 6 w razie potrzeby.

Oczywiście nie do końca to, czego szukałeś, ale zwykle to robię.

Tumbler41
źródło
to super! Nigdy nie zdawałem sobie sprawy, że kiedy przeprowadzasz wyszukiwanie /, zachowuje się również jako selekcja wizualna - fajnie.
the_velour_fog,
@ thevvelour_fog " /... 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życie npowoduje przejście do następnego wystąpienia.
Tumbler41,
1
Jeśli nie określisz wzorca :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)/go zapisanie części tekstu.
Haegin,
@ Tumbler41 ah, dzięki za wyjaśnienie. Tak, robię też tę podstawową technikę wyszukiwania , następnie stosuję makro , zwykle najpierw wypełniam arglistę i używam, :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/.../..../gci rozpocząć pływające po operacji
the_velour_fog