Saya perlu melakukan banyak penggantian kata dalam file dan ingin melakukannya dengan perintah vi, bukan perintah EX seperti :%s///g
. Saya tahu bahwa ini adalah cara umum untuk mengganti kata pada posisi kursor saat ini: cw<text><esc>
tetapi adakah cara untuk melakukan ini dengan isi register yang tidak disebutkan namanya sebagai teks pengganti dan tanpa menimpa register?
110
12yl
mencabut 12 karakter dan"_cw^r0
mengganti satu kata. Saya kemudian dapat menggunakan.
perintah untuk mengulangi penggantian di seluruh file.Jawaban:
Saya berpikir dengan "tempel" yang Anda maksud adalah register yang tidak disebutkan namanya (yank / put / ubah / hapus / ganti), bukan? (Karena itulah yang akan ditimpa oleh perintah perubahan.)
Register umumnya ditentukan dengan mengetik
"
kemudian nama (karakter tunggal) dari register tersebut, seperti"ay
kemudian"ap
mencabut ke registera
, kemudian memasukkan isi registera
. Hal yang sama berlaku untuk perintah perubahan. Dalam hal ini, jika Anda tidak ingin teks Anda menghapus dengan perintah perubahan untuk pergi ke mana pun, Anda dapat menggunakan lubang hitam mendaftar"_
:"_cw
. Kemudian sekali dalam mode penyisipan, Anda dapat menekan ctrl-R diikuti oleh register yang Anda inginkan (mungkin"
) untuk dimasukkan ke dalam isi register itu."*
- daftar pilihan (tempel tombol tengah)"+
- register clipboard (mungkin juga dapat diakses dengan ctrl-shift-v melalui terminal)""
- register default vim (tanpa nama) yank / put / ubah / hapus / pengganti.Jawaban singkat:
"_cw^R"
Sunting: seperti yang disarankan orang lain, tentu saja Anda dapat menggunakan register yang berbeda untuk yank (atau apa pun) yang memasukkan teks Anda ke register default. Anda tidak selalu memikirkannya terlebih dahulu, jadi bagus untuk melakukan satu perintah perubahan tanpa merusaknya. Meskipun itu tidak sepenuhnya terpesona. Ada register bernomor
"0
melalui"9
:sumber
:help registers
.Menggunakan informasi dalam posting ini, saya telah membentuk pemetaan yang berguna ini. Saya memilih 'cp' karena itu berarti "ubah tempel"
nmap <silent> cp "_cw<C-R>"<Esc>
EDIT:
Saya juga mengambil langkah lebih jauh dan mendukung gerakan apa pun.
Untuk mendapatkan perintah yang setara di atas, itu adalah
cpw
untuk "ubah kata tempel"sumber
nmap <silent> cp :let g:currentRegister=v:register<cr>:set opfunc=ChangePaste<CR>g@ function! ChangePaste(type, ...) silent exe "normal! `[v`]\"_c".getreg(g:currentRegister) endfunction
Anda dapat menggunakan mode visual vim untuk ini. misalnya salin kata:
ye
lalu timpa kata lain dengan kata yang disalin:vep
sumber
Jika kursor Anda berada pada kata yang ingin Anda ganti dengan isi register tanpa nama, Anda dapat menggunakan
viwp
.v
beralih ke mode visual,iw
memilih kata dalam, danp
meletakkan konten register pada tempatnya.Dalam praktiknya, ketika saya perlu mengganti satu kata (nama fungsi, dll.) Dengan yang lain, saya akan pindah ke kata yang akan digunakan sebagai pengganti,
yiw
untuk menarik kata dalam ke register yang tidak disebutkan namanya, lalu pindah ke kata I ' m mengganti, danviwp
menggantinya. Cara yang cukup cepat untuk mengganti satu kata dengan kata lain. Jika Anda mencari (/
) untuk kata yang Anda ganti untuk mendapatkannya, Anda dapat menekann
untuk sampai ke kemunculan berikutnya yang perlu Anda ganti. Jelas tidak ada pengganti untuk menggunakan:%s/find/replace/g
, tetapi untuk beberapa penggantian cepat ini bisa berguna, terutama jika Anda sudah memiliki kata baru dalam register.sumber
Jika Anda menggunakan register bernama (mis. Use
"ay
or"ad
, etc., untuk mengisi register tempel Anda), Anda dapat melakukan sesuatu seperticw<CTRL-R>a<esc>
Yang akan menggantikan kata tersebut dengan isi register
a
. Sejauh yang saya tahu, Anda tidak dapat menggunakan register default karena ketika Andacw
akan diisi dengan kata yang dipotong oleh perintah itu.sumber
Apakah yang Anda maksud adalah buffer tempel sistem atau register vi?
Jika Anda ingin menggunakan buffer tempel sistem maka Anda baik-baik saja dan dapat melakukannya
dw"+P
-"
pilih register, dan"+
merupakan buffer tempel sistem.Jika tidak salin ke register non-default dengan mengatakan
"ay
untuk menyalin ke registera
dan kemudian mengganti sesuatudw"aP
sumber
dw
menghapus spasi setelah apa yang saya anggap sebagai "kata", sedangkancw
hanya mengubah kata. Untuk alasan itu,dw
tidak akan berhasil untuk saya.de
seharusnya bekerja untuk Anda - itu akan menghapus sampai akhir kata ini, sementaradw
akan menghapus ke awal kata berikutnya.Anda dapat menggunakan
yw
kata yank, kemudian Anda dapat mengubah kata dengan kata yanked byvipw
to yank word dan menempelkan kata yank sebelumnya.sumber
Anda dapat menggunakan register untuk itu:
teks pengganti tempat pertama dalam register
<mark some text>"ay
dimana
a
nama registermaka Anda dapat menggunakan register itu sebagai pengganti
ve"ap
sumber
.
, yang merupakan hal lain yang ingin saya lakukan. Terimakasih Meskipun. Sangat dihargai.Atau Anda dapat melakukan Shift+ v- p(pilih seluruh baris dan tempelkan di tempatnya)
sumber