Czy mogę zrobić interaktywny: zamień (wyszukaj i zamień)?

17

Czasami używam :sze skomplikowanym wyrażeniem regularnym, które może, ale nie musi być poprawne, lub nie jestem pewien, czy chcę zastąpić wszystkie dopasowania.

Czy mogę w jakiś sposób powiedzieć Vimowi, aby potwierdzał każde znalezione dopasowanie, zanim faktycznie zastąpi tekst?

Martin Tournoij
źródło

Odpowiedzi:

20

Tak! Użyj cflagi 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ład użycia jest prosty jak ciasto:

%s/old/new/c

Jest to bardzo przydatne, ale nie wiedziałem o tym jeszcze 2 tygodnie temu :-) I jest nawet dostępne w ol 'vi :-)

Dodatkowa wskazówka: Możesz także użyć :set nowrapscan; Zapobiega to zawijaniu się Vima do góry, gdy uderza w dno. Uważam, że jest to szczególnie przydatne podczas używania cflagi.

Martin Tournoij
źródło
19

Oprócz tego, co powiedział Carpetsmoker:

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

Sztuką jest wypróbowanie złożonego wyrażenia regularnego za pomocą polecenia /lub ?. Vim użyje tego &incsearchustawienia do interaktywnego wyświetlania meczów. Gdy będziesz zadowolony z wyrażenia regularnego, możesz użyć :%s//replacementvima, by użył poprzedniego wyszukiwania.

Zauważ, że część w //jest pusta (w tym miejscu wpisujesz tekst do wyszukiwania). Jeśli pozostawisz to puste, mówisz Vimowi, aby używał poprzedniego wyrażenia regularnego wyszukiwania. Dzięki temu możesz pisać złożone wyrażenia regularne za pomocą /i mieć wszystkie zalety set incsearch, a następnie użyć %s//replacementpolecenia, aby faktycznie wykonać wyszukiwanie i zamienić.

Jeśli chcesz czegoś podobnego do wyszukiwania :spoleceń, sprawdź vim-over , ale ja po prostu wolę używać natywnego sposobu Vima.

akshay
źródło
Kiedyś używałem tego wariantu: po prostu użyj, :%s/pattern/replace/a następnie naciśnij, uaby cofnąć, możesz zobaczyć części, które Vim zmienił, jeśli hlsearchwłączyłeś. Możesz ponownie zamienić ten tekst na ^R.
Martin Tournoij
7

Moim ulubionym interaktywnym zastępstwem jest wyszukiwanie za pomocą /i przechodzenie przez mecze za pomocą n.

Następnie wybierz dopasowanie za pomocą, gna następnie, saby zastąpić tekst tym, co lubię.

I powtórzyć przenosząc się do następnego meczu i naciskając.

Neaţu Ovidiu Gabriel
źródło
Jest to bardzo fajna sztuczka, ponieważ jest: (1) interaktywna, (2) możesz przejść poprzedni mecz, jeśli przypadkowo go pominąłeś (coś, czego nie możesz zrobić :s/old/new/gc).
Ayrat
3

W Neovim jest również 'inccommand'opcja, która pozwala wyświetlić podgląd :spolecenia podczas pisania.

Lucas
źródło
1

Z korzyścią dla wszystkich incsearchzostał zaktualizowany w vim8, aby wyświetlał również podgląd podczas pisania wzoru

Dhruva Sagar
źródło