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?

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.


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.


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.


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.


1

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.