VIM Ganti kata dengan isi buffer tempel?

110

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?

plong
sumber
8
RESOLUSI: Untuk kebutuhan mendesak saya, saya biasa 12ylmencabut 12 karakter dan "_cw^r0mengganti satu kata. Saya kemudian dapat menggunakan .perintah untuk mengulangi penggantian di seluruh file.
plong

Jawaban:

127

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 "aykemudian "apmencabut ke register a, kemudian memasukkan isi register a. 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 "0melalui "9:

Vim mengisi register ini dengan teks dari perintah yank dan delete.

Register bernomor 0 berisi teks dari perintah yank terbaru, kecuali jika perintah tersebut menentukan register lain dengan ["x].

Register bernomor 1 berisi teks yang dihapus oleh perintah delete atau change terbaru, kecuali jika perintah tersebut menentukan register lain atau teksnya kurang dari satu baris (kemudian register hapus kecil digunakan). Pengecualian dibuat untuk operator delete dengan perintah gerakan ini: %, (, ), `, /, ?, n, N, {dan }. Register "1 selalu digunakan kemudian (ini kompatibel dengan Vi). Register" - digunakan juga jika penghapusan berada dalam satu baris.

Dengan setiap penghapusan atau perubahan yang berurutan, Vim menggeser isi register 1 sebelumnya menjadi register 2, 2 menjadi 3, dan seterusnya, kehilangan isi register 9 sebelumnya.

Bertingkat
sumber
1
Baiklah, pikir saya sudah cukup menyalin dokumen di register ke jawaban saya? Semuanya ada di bawah :help registers.
Cascabel
48

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 cpwuntuk "ubah kata tempel"

"This allows for change paste motion cp{motion}
nmap <silent> cp :set opfunc=ChangePaste<CR>g@
function! ChangePaste(type, ...)
    silent exe "normal! `[v`]\"_c"
    silent exe "normal! p"
endfunction
ostler.c
sumber
<silent> menyebabkannya tidak bekerja untuk saya ... ada ide mengapa itu terjadi? Saya n00b di pemetaan & fungsi.
Hollister
Satu-satunya masalah dengan ini adalah Anda tidak dapat memilih register untuk ditempelkan ... tetapi dalam hal ini saya kira Anda hanya bisa cw dan menggunakan CTRL + R
Steve Vermeulen
2
Mungkin ada cara yang lebih baik untuk menambahkan penamaan register tetapi yang berikut berhasil untuk saya: 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
Steve Vermeulen
@eventualEntropy ini berfungsi dengan baik untuk mengganti baris, bagaimana saya bisa membuat ini berfungsi untuk kata-kata alih-alih baris, saya masih belajar vim. Terima kasih untuk bantuannya.
Xavitoj Cheema
@XavitojCheema Saya bahkan tidak ingat membuat komentar itu, haha. Tetapi ternyata, saya sebenarnya telah menulis plugin untuk menyediakan fungsionalitas ini ( github.com/svermeulen/vim-easyclip )
Steve Vermeulen
27

Anda dapat menggunakan mode visual vim untuk ini. misalnya salin kata: yelalu timpa kata lain dengan kata yang disalin:vep

Ste
sumber
9
Ini berfungsi, tetapi juga harus dicatat bahwa pasta visual menimpa buffer yank untuk teks yang baru dihapus.
ostler.c
24

Jika kursor Anda berada pada kata yang ingin Anda ganti dengan isi register tanpa nama, Anda dapat menggunakan viwp. vberalih ke mode visual, iwmemilih kata dalam, dan pmeletakkan 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, yiwuntuk menarik kata dalam ke register yang tidak disebutkan namanya, lalu pindah ke kata I ' m mengganti, dan viwpmenggantinya. Cara yang cukup cepat untuk mengganti satu kata dengan kata lain. Jika Anda mencari ( /) untuk kata yang Anda ganti untuk mendapatkannya, Anda dapat menekan nuntuk 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.

Travis Northcutt
sumber
4
Saya terkejut ini bukan solusi yang diterima: semua hal di atas, sementara lebih fleksibel dalam beberapa kasus tepi, jauh lebih bertele-tele hanya untuk 'menukar register yang tidak disebutkan namanya saat ini untuk pilihan di suatu tempat,' yang merupakan situasi aslinya penanya datang ke sini untuk.
ELLIOTTCABLE
1
Ini sangat berguna dan intuitif.
lacostenycoder
6

Jika Anda menggunakan register bernama (mis. Use "ayor "ad, etc., untuk mengisi register tempel Anda), Anda dapat melakukan sesuatu seperti

cw<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 Anda cwakan diisi dengan kata yang dipotong oleh perintah itu.

Daniel Vandersluis
sumber
Anda dapat menggunakan register default! Lihat jawaban saya.
Cascabel
2

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 "ayuntuk menyalin ke register adan kemudian mengganti sesuatudw"aP

Hamish Downer
sumber
Terima kasih, Hamish. Saya mencobanya, tetapi dwmenghapus spasi setelah apa yang saya anggap sebagai "kata", sedangkan cwhanya mengubah kata. Untuk alasan itu, dwtidak akan berhasil untuk saya.
plong
Dalam hal itu deseharusnya bekerja untuk Anda - itu akan menghapus sampai akhir kata ini, sementara dwakan menghapus ke awal kata berikutnya.
Hamish Downer
1

Anda dapat menggunakan ywkata yank, kemudian Anda dapat mengubah kata dengan kata yanked by vipwto yank word dan menempelkan kata yank sebelumnya.

YevgenyYork
sumber
0

Anda dapat menggunakan register untuk itu:

teks pengganti tempat pertama dalam register <mark some text>"ay

dimana anama register

maka Anda dapat menggunakan register itu sebagai pengganti

ve"ap

lollinus
sumber
Sayangnya, saya tidak bisa begitu saja mengulangi yang terakhir, operasi tempel lewat ., yang merupakan hal lain yang ingin saya lakukan. Terimakasih Meskipun. Sangat dihargai.
plong
0

Atau Anda dapat melakukan Shift+ v- p(pilih seluruh baris dan tempelkan di tempatnya)

elimirks
sumber
1
atau pdw ... Apakah kamu tidak suka vim? : P
elimirks