Czy mogę wykonać interaktywną: substytut (szukaj & zamień)?

Czasami używam :s ze skomplikowanym wyrażeniem regularnym, które może być poprawne lub nie, albo nie na pewno chcę zamienić wszystkie dopasowania.

Czy jest jakiś sposób, żebym mógł powiedzieć Vimowi, żeby potwierdzał każde dopasowanie, które znajdzie, zanim faktycznie zastąpi tekst?

Odpowiedź

Tak! Użyj flagi c dla :substitute. Od :help substitute:

[c] Confirm each substitution. Vim highlights the matching string (with hl-IncSearch). You can type: :s_c "y" to substitute this match "l" to substitute this match and then quit ("last") "n" to skip this match <Esc> to quit substituting "a" to substitute this and all remaining matches {not in Vi} "q" to quit substituting {not in Vi} CTRL-E to scroll the screen up {not in Vi, not available when compiled without the +insert_expand feature} CTRL-Y to scroll the screen down {not in Vi, not available when compiled without the +insert_expand feature} 

Przykładowe użycie jest proste:

%s/old/new/gc 

To jest bardzo przydatne, ale nie wiedziałem o tym do 2 tygodni temu 🙂 I jest nawet dostępne w ol „vi 🙂

Dodatkowa wskazówka: możesz także użyć :set nowrapscan; zapobiega to zawijaniu Vima do góry, gdy uderza w dół. Uważam, że jest to szczególnie przydatne podczas używania flagi c.

Komentarze

  • Dodałbym również, że jeśli chcesz zamienić wszystkie wystąpienia old w tym samym wierszu (a nie tylko pierwsze wystąpienie), należy dodać g na końcu polecenia, więc w sumie będziesz mieć %s/old/new/gc
  • O tak; mam set gdefault więc zwykle zapominam dodać go w przykładach @ e271p314 😅

Odpowiedź

Oprócz tego, co powiedział Carpetsmoker:

Ustawienie &incsearch (set incsearch) w Vimie jest naprawdę przydatne. Możesz użyj go razem z użyteczną i mało znaną sztuczką.

Sztuczka polega na wypróbowaniu złożonego wyrażenia regularnego, używając po prostu / lub ? polecenie. Vim użyje ustawienia &incsearch do interaktywnego wyświetlania dopasowań. Onc Jeśli „jesteś zadowolony z wyrażenia regularnego, możesz użyć :%s//replacement, aby vim użył poprzedniego wyszukiwania.

Zwróć uwagę, że część w // jest puste (to” tam, gdzie umieszczasz tekst do wyszukania). Jeśli zostawisz to pole puste, mówisz Vimowi, aby użył poprzedniego wyrażenia regularnego wyszukiwania. Dzięki temu możesz wpisać złożone wyrażenie regularne za pomocą / i skorzystać ze wszystkich zalet set incsearch, a następnie użyć %s//replacement, aby faktycznie wykonać wyszukiwanie i zamianę.

Jeśli potrzebujesz czegoś podobnego do incsearch dla poleceń :s, wypróbuj vim-over , ale wolę po prostu używać natywnego sposobu Vima.

Komentarze

  • Kiedyś używałem tego wariantu: po prostu użyj :%s/pattern/replace/, a następnie naciśnij u, aby cofnąć, możesz zobaczyć części, które Vim zmienił jeśli masz włączoną hlsearch. Możesz ponownie zamienić ten tekst na ^R.

Odpowiedź

Moim ulubionym interaktywnym zastępowaniem jest wyszukiwanie za pomocą / i przeglądanie dopasowań za pomocą n .

Następnie wybierz dopasuj za pomocą g n , a następnie s do zastąp tekst tym, co lubię .

I powtórz , przechodząc do następnego dopasowania i naciskając .

Komentarze

  • To bardzo fajna sztuczka, ponieważ jest: (1) interaktywna, (2) możesz przejść do poprzedniego dopasowania, jeśli przypadkowo pominąłeś to (coś, czego nie można zrobić za pomocą :s/old/new/gc).

Odpowiedź

W Neovim jest również

, która umożliwia podgląd wyniku działania polecenia :s podczas jego wpisywania.

Odpowiedź

Z korzyścią dla wszystkich incsearch został zaktualizowany w wersji vim8, aby wyświetlać również podgląd podczas wpisywania wzoru

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *