Bisakah saya melakukan interaktif: pengganti (cari & ganti)?

17

Kadang-kadang saya menggunakan :sregexp rumit yang mungkin atau mungkin tidak benar, atau tidak yakin apakah saya ingin mengganti semua kecocokan.

Apakah ada cara saya dapat memberitahu Vim untuk mengonfirmasi setiap kecocokan yang ditemukannya sebelum itu benar-benar menggantikan teks?

Martin Tournoij
sumber

Jawaban:

20

Iya! Gunakan cbendera untuk :substitute. Dari :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}

Contoh penggunaannya sederhana seperti pie:

%s/old/new/c

Ini sangat berguna, tetapi tidak tahu tentang ini sampai 2 minggu yang lalu :-) Dan itu bahkan tersedia di ol 'vi :-)

Kiat bonus: Anda mungkin juga ingin menggunakan :set nowrapscan; ini mencegah Vim dari pembungkus ke atas ketika menyentuh bagian bawah. Saya menemukan ini sangat berguna saat menggunakan cbendera.

Martin Tournoij
sumber
19

Selain apa yang dikatakan Carpetsmoker:

Pengaturan &incsearch( set incsearch) di Vim sangat berguna. Anda dapat menggunakannya bersama-sama dengan trik yang bermanfaat dan sedikit diketahui.

Caranya adalah dengan mencoba regex kompleks Anda hanya dengan menggunakan perintah /atau ?. Vim akan menggunakan &incsearchpengaturan untuk menampilkan pertandingan secara interaktif. Setelah puas dengan regex, Anda dapat menggunakan :%s//replacementvim menggunakan pencarian sebelumnya.

Perhatikan bagaimana bagian dalam //kosong (di situlah Anda meletakkan teks untuk dicari). Jika Anda membiarkannya kosong, Anda memberi tahu Vim untuk menggunakan regex pencarian sebelumnya. Dengan ini, Anda bisa mengetikkan regex kompleks dengan /dan memiliki semua manfaat set incsearch, dan kemudian menggunakan %s//replacementperintah untuk benar-benar menjalankan pencarian dan ganti.

Jika Anda menginginkan sesuatu yang mirip dengan pencarian :sperintah, periksa vim-over , tapi saya lebih suka menggunakan cara Vim asli.

akshay
sumber
Saya dulu menggunakan varian ini: Cukup gunakan :%s/pattern/replace/dan kemudian tekan uuntuk membatalkan, Anda dapat melihat bagian-bagian yang Vim berubah jika Anda telah hlsearchmengaktifkan. Dan Anda dapat mengganti teks ini lagi dengan ^R.
Martin Tournoij
7

Substitusi interaktif favorit saya adalah mencari menggunakan /dan menelusuri pertandingan menggunakan n.

Kemudian pilih kecocokan menggunakan gndan kemudian suntuk mengganti teks dengan apa pun yang saya suka.

Dan ulangi dengan pindah ke pertandingan berikutnya dan menekan.

Neaţu Ovidiu Gabriel
sumber
Ini adalah trik yang sangat bagus, karena: (1) interaktif, (2) Anda dapat pergi pertandingan sebelumnya jika Anda secara tidak sengaja melewatkannya (sesuatu yang tidak dapat Anda lakukan menggunakan :s/old/new/gc).
Ayrat
3

Di Neovim ada juga 'inccommand'opsi yang memungkinkan Anda melihat pratinjau hasil :sperintah saat Anda mengetiknya.

Lucas
sumber
1

Demi kepentingan semua orang, incsearchtelah diperbarui di vim8 untuk juga menampilkan pratinjau saat Anda mengetik polanya

Dhruva Sagar
sumber