Vim - pilih teks yang disorot oleh pencarian?

53

Dalam vim, saya sering melakukan pencarian untuk melompat ke kata atau frasa alih-alih menavigasi ke sana h/j/k/l. Lalu aku memukul nuntuk melompat di antara kejadian.

Katakanlah saya punya teks ini:

Time flies like an arrow; fruit flies like a banana. - Groucho Marx

Saya mengetik /an arrowdan menekan enter. Ungkapan itu disorot, dan saya langsung menggunakannya n.

Sekarang saya ingin memilih teks itu secara visual , mungkin untuk mengubahnya atau menghapusnya. (Ya, saya mengetahui :sperintah substitusi.)

Karena kursor saya berada di huruf "a" di awal "panah," saya bisa menekan v, lalu tekan ebeberapa kali untuk menyorot seluruh frasa. Tapi saya punya perasaan ada cara yang lebih pendek dan lebih semantik. Lagi pula, saya sudah menentukan teks yang saya minati.

Bagaimana saya bisa membuat perintah untuk mengatakan "pilih secara visual pilihan pencarian saat ini?"

Nathan Long
sumber

Jawaban:

38

Anda dapat menggunakan gndalam versi 7.4 dan seterusnya (dan gNuntuk mundur). Ini menggantikan v//etriknya.

Cari maju untuk pola pencarian yang terakhir digunakan, seperti dengan `n`, dan mulai mode Visual untuk memilih yang cocok.

Lihat :help gnatau Vimcast ini untuk informasi lebih lanjut.

David Lord
sumber
Ini menggandakan komentar ke jawaban lain dan tidak terlalu berguna. Mungkin merupakan ide yang baik jika Anda mengutip dokumentasi sehingga jawaban Anda dapat berdiri sendiri.
bwDraco
2
Senang membuat jawabannya lebih baik tetapi saya tidak yakin apakah itu akan membantu. Pertanyaan menjabarkan tujuannya dengan rapi ("pilih secara visual hasil pencarian berikutnya") dan gnlakukan persis seperti yang diminta. Menyerahkannya sebagai jawaban terpisah menekankan bahwa itu adalah pengganti yang lengkap untuk v//e. Saya baru saja mengedit jawaban saya untuk menambahkan dokumentasi, apakah itu lebih baik?
David Lord
Bagus, terima kasih. Jika Anda membutuhkan bantuan, pastikan untuk memeriksa tur dan pusat bantuan . Selamat datang di Pengguna Super, dan kami harap Anda menikmati masa tinggal Anda.
bwDraco
1
Fantastis! Terima kasih telah memperbarui utas ini dengan yang terbaru dan terbaik. :)
Nathan Long
29

Coba ini:

/an arrow
v//e

Ini masuk ke mode visual, mengulangi pencarian terakhir dan memilih sampai akhir.

Dennis Williamson
sumber
1
Dari Vim 7.4 pada gnmelakukan ini juga (tanpa mengubah apa nartinya)
batal
8

Saya menemukan bahwa v//eitu sendiri tidak cukup karena setelah Anda keluar dari mode visual, melompat ke hasil pencarian berikutnya / sebelumnya menempatkan kursor di akhir hasil, bukan pada awalnya seperti yang Anda harapkan.

Untuk mengatasinya, pertama-tama kita harus melompat ke akhir hasil pencarian ( //e) dan kemudian memilih secara visual ke awal ( v??):

" visually select a search result
nnoremap g/ //e<Enter>v??<Enter>

Tepuk tangan.

sunaku
sumber
Untuk simetri: nnoremap g? ??b<cr>v//e<cr>(melakukan hal yang sama tetapi mencari mundur alih-alih ke depan)
Kyle Strand
2

Sekarang ada plugin Vim-Search-Objects yang membuat Vim memperlakukan pertandingan pencarian sebagai objek teks biasa, sehingga Anda dapat dengan mudah va/(memilih visual yang cocok) setelah Anda melakukan pencarian.

sunaku
sumber
1

Cara "dumbber" untuk melakukannya adalah memetakan kunci (dalam hal ini F5) seperti di bawah ini:

nnoremap <F5> v/<c-r>=strpart(@/,1) . '/e+1'<CR><CR>

Setelah /an arrowmenekan F5.

Johnny
sumber
Itu memilih satu karakter lagi karena +1. Hapus itu dan hanya akan memilih bagian yang dicari. Di sisi lain, nnoremap <F5> v//e<CR>tampaknya berfungsi dengan baik.
Dennis Williamson
@Dennis Williamson, +1 diperlukan untuk memilih dengan tepat apa yang dicari, jika Anda menghapus +1 karakter terakhir tidak akan dipilih karena tidak memilih karakter di mana kursor berada. Bagaimanapun nnoremap <F5> v // e <CR> jauh lebih baik.
Johnny
Itu memang memilih karakter untuk saya. Jika saya menekan xatau csetelah melakukan F5tetapi tanpa +1seluruh string pencarian, termasuk karakter di bawah kursor, dihapus.
Dennis Williamson
@ Dennis Williamson, saya baru tahu bahwa opsi 'seleksi' saya disetel ke "eksklusif", tetapi nilai defaultnya adalah "inklusif". Itu sebabnya itu bekerja untuk Anda tanpa +1. (Lihat: seleksi bantuan)
Johnny