Katakanlah kita memiliki teks, dan saya memasuki mode visual dan memilih beberapa teks. Bagaimana cara cepat saya menelusuri teks yang disorot dan menggantinya dengan yang lain?
109
Coba lakukan hal berikut atau masukkan ke file .vimrc
vnoremap <C-r> "hy:%s/<C-r>h//gc<left><left><left>
Dengan menekan ctrl+ rdalam mode visual, Anda akan diminta untuk memasukkan teks yang akan diganti. Tekan enterdan kemudian konfirmasikan setiap perubahan yang Anda setujui yatau tolak n.
Perintah ini akan menimpa register h
Anda sehingga Anda dapat memilih yang lain (dengan mengubah h
perintah di atas ke huruf kecil lainnya) yang tidak Anda gunakan.
c
ingc
, penggantian dilakukan sekaligus di seluruh buffer. Jika Anda membuat kesalahan dan ingin mengembalikannya, cukup ketiku
mode perintah. Saya menyukai pendekatan ini lebih baik daripada mengkonfirmasi masing-masing penggantian (yang terjadi denganc
pengubah).vmap * y:let @/ = @"<CR>
dipilih disorot.<left><left><left>
?c
darigc
, Anda juga harus menghapus salah satu dari<left>
akhir baris.Pencarian pemetaan yang cepat dan sederhana ini untuk teks yang disorot secara visual (tanpa menimpa register h) dan tanpa menggunakan register dependen terminal:
Jika Anda tidak suka ctrl-f ubah ke preferensi Anda
Setelah teks disorot, Anda selalu dapat melakukan
s
ubstitusi hanya dengan mengetik:... karena pencarian kosong pada
s
perintah menggunakan string yang dicari terakhir.sumber
control+f
selalu memilih karakter berikutnya serta apa yang saya pilih secara visual. Ada ide?%s//<your-replacement-string>
sepertinya tidak berfungsi untuk menyorot sesuatu seperti/tmp/file
. itu hanya menjadi<your-replacement-string>/tmp/file
Yang ini juga berfungsi (setidaknya untuk pilihan dalam satu baris / pilihan yang tidak mengandung karakter khusus)
y
:s/<C-r>0/
0
adalah register yank.Seperti yang disebutkan orang lain, ada cara yang lebih cepat untuk melakukan ini, tetapi jika Anda baru saja mulai mempelajari Vim (seperti saya), ini adalah salah satu cara 'umum'.
// edit: Saya baru menyadari bahwa pendekatan 'register' akan gagal jika ada karakter seperti tab atau baris baru atau
/
karakter dalam pemilihan (saya harus memproses karakter tersebut secara manual agar:s
perintah berfungsi):sumber
Jawaban yang diterima berfungsi dengan baik kecuali Anda memiliki karakter khusus dalam pemilihan visual Anda. Saya meretas dua skrip ( Jeremy Cantrell diposting di sini & Peter Odding ) untuk membuat perintah yang memungkinkan Anda untuk memilih secara visual string yang ingin Anda temukan meskipun memiliki karakter regex khusus di dalamnya.
Saya telah memasukkan ini di vimrc saya jika itu lebih berguna bagi siapa pun.
sumber
vmap <C-r> <Esc>:%s/<c-r>=GetVisual()<cr>//g<left><left>
(yang baru saja menggantikan semua dalam file)Dari Vim 7.4, Anda dapat menggunakan
gn
gerakan yang memilih wilayah teks yang cocok dengan pola pencarian saat ini.Setelah menggunakan
cgn
untuk mengubah teks dalam pertandingan yang dipilih saat ini (ataudgn
untuk menghapus), dalam mode normal, Anda dapat menggunakan.
untuk mengulangi perintah dan mengoperasikan pertandingan berikutnya.Ada episode Vimcast yang menampilkan fitur ini.
sumber
Mykola Golubyev, Terima kasih atas tipnya! Berikut menggunakan register "+" yang (tergantung pada terminal Anda) sudah berisi teks yang disorot, menghemat penggunaan register "h".
sumber
Dari http://vim.wikia.com/wiki/Search_and_replace_in_a_visual_selection :
Saat teks dipilih secara visual, tekan: untuk memasukkan perintah. Baris perintah secara otomatis akan memasuki kisaran:
Anda dapat memasukkan perintah seperti s / red / green / g untuk mengganti setiap merah dengan hijau di semua baris pemilihan visual terakhir. Perintah akan muncul sebagai:
Untuk mengulangi perintah Ex di atas blok yang dipilih sebelumnya, gunakan: history. Yaitu, tekan: lalu, lalu edit perintah sebelumnya.
sumber
Saya memiliki ini di vimrc saya:
Ini akan mengambil pilihan visual dan memulai perintah substitusi dengannya.
EDIT: Saya harus menunjukkan bahwa ini tidak berfungsi dengan pilihan visual multiline. Meskipun GetVisual () tidak memiliki masalah mengembalikannya, saya tidak yakin bagaimana memasukkannya ke dalam baris perintah dengan benar. Jika ada yang punya tip tentang bagaimana saya bisa melakukan ini, tolong beri komentar.
sumber
Saya tidak berpikir Anda bisa melakukan ini di luar kotak. Tetapi banyak orang menyukai fitur ini, jadi ada banyak sekali makro dan semacamnya (saya telah menambahkannya sendiri). Ini salah satu yang bisa Anda tambahkan, misalnya; cukup tekan
*
untuk mencari kecocokan berikutnya pada teks yang dipilih secara visual.sumber
Jawaban lain bagus tetapi tidak luput dari karakter khusus. The jawaban dari @ Brian kennedy menunjukkan metode untuk melarikan diri tetapi membutuhkan banyak kode. Dalam kasus URL misalnya, melarikan diri adalah wajib atau pencarian akan berhenti di ":".
Seperti yang tertulis di vim.fandom.com/wiki/Search_for_visually_selected_text , Anda dapat melakukan oneliner untuk mencari dan melepaskan beberapa karakter. Anda dapat melarikan diri dari karakter yang Anda inginkan, saya memilih untuk melarikan diri
/\:
:Dengan peta ini, saya harus menekan
//
dalam mode visual untuk mencari teks yang sedang dipilih di seluruh buffer.sumber
Versi pendek favorit saya adalah
vnoremap s / y: s / "/
Kemudian Anda dapat menyorot sebuah pilihan dan tekan saja s / untuk memulai perintah substitusi untuknya.
sumber
"
sebagai literal.<c-r>"
bekerja meskipunSaya tidak memiliki perwakilan untuk berkomentar, jadi saya menambahkan jawaban lain ...
vnoremap <C-r> "0y<Esc>:%s/<C-r>0//g<left><left>
@dmd dan @dotancohen: ini bekerja untuk saya tanpa menggunakan habis
"h
(secara eksplisit menggunakan 0, yang merupakan posisi yank terakhir) dan bekerja dengan putty ssh -> mint (lmde); tidak tahu tentang sen. Juga menggunakan komentar @Niloct dan @Nathan Friend untuk menghapus konfirmasi.sumber
Contoh 1. Pemilihan kutipan dengan bintang, pertahankan kursor di awal pemilihan.
Contoh 2. Pipa teks yang dipilih dengan base64:
Penjelasan LHS:
Penjelasan RHS:
sumber
Saya berharap ada cara built-in di Vim untuk menggantikan kata, tanpa harus mengetik ulang kata itu di tempat pertama. Ada, meski hanya akan berfungsi untuk teks hingga karakter batas kata.
Setelah Anda mengarahkan mouse ke kata tersebut, tekan
*
atau#
untuk menyorot kata dan lompat ke lokasi berikutnya / sebelumnya (jika Anda tidak ingin mengubah lokasi di file, lalu tekan tombol yang berlawanan untuk kembali ke lokasi kamu baru saja di).Kemudian ketik saja:
%s//<your-replacement-string>
Seperti yang disebutkan dalam jawaban orang lain, jika
%s
menerima entri kosong di antara garis miring, maka kata tersebut menggunakan kata yang telah dicari sebelumnya. Dengan menekan*
atau#
, Anda mencari kata di bawah kursor yang menjadikannya kata yang paling baru dicari.Pada akhirnya, hanya enam atau tujuh penekanan tombol + panjang kata pengganti untuk melakukan ini dan tidak memerlukan makro atau pengeditan file
.vimrc
.sumber