Menggunakan Vim, saya sering ingin mengganti satu blok kode dengan satu blok yang baru saja saya tarik.
Tetapi ketika saya menghapus blok kode yang akan diganti, blok itu sendiri masuk ke register yang menghapus blok yang baru saja saya tarik. Jadi saya punya kebiasaan menarik, kemudian memasukkan, kemudian menghapus apa yang tidak saya inginkan, tetapi dengan blok kode yang besar ini menjadi berantakan mencoba untuk menjaga blok yang dimasukkan dan blok untuk menghapus terpisah.
Jadi apa cara tercepat dan paling cepat untuk mengganti teks dalam Vim?
- apakah ada cara untuk menghapus teks tanpa memasukkannya ke dalam register?
- apakah ada cara untuk mengatakan misalnya "ganti kata berikutnya" atau "ganti hingga paragraf berikutnya"
- atau apakah cara terbaik untuk menggunakan fitur multi-register entah bagaimana?
vim
replace
vim-registers
Edward Tanguay
sumber
sumber
viwp
(untukw
ord).Jawaban:
Untuk menghapus sesuatu tanpa menyimpannya dalam register, Anda dapat menggunakan "register lubang hitam":
Tentu saja Anda juga bisa menggunakan register lain yang tidak memiliki apa pun yang Anda minati.
sumber
"<space>_d
. Ruang diperlukan untuk benar-benar mengetikkan ".dd
pada baris kosong itu masuk ke lubang hitam, kalau tidakdd
seperti biasa)."_x
yy
atau '3yy' (atau apa pun), yang menempatkannya dalam register yang tidak disebutkan namanya, tetapi juga dalam 0. Anda kemudian dapat menempelkannya dengan"0p
, meskipun telah digunakand
setelah itu.Ya. Ini sedikit lebih berbelit-belit daripada menghapus teks "lama" terlebih dahulu, tetapi:
Saya mulai dengan ..
Saya shift+ vmemilih baris1, baris 2, 3 dan 4, dan menghapusnya dengan dperintah
Kemudian saya menghapus 1-4 baris lama dengan cara yang sama.
Lalu, lakukan
Itu akan menempelkan kedua baris terakhir yang dicabut (baris 1-4).
"3p
akan melakukan yang ketiga dari terakhir, dan seterusnya ..Jadi saya berakhir dengan
Referensi: Dokumentasi Vim tentang register bernomor
sumber
Dokumen VIM: Register bernomor 0 berisi teks dari perintah yank terbaru, kecuali jika perintah tersebut menentukan register lain dengan ["x].
Misalnya kita mencabut "foo" dan menghapus "bar" - registri 0 masih mengandung "foo"! Karenanya "foo" dapat ditempel menggunakan
"0p
sumber
Berguna untuk memiliki pemetaan yang mudah yang memungkinkan Anda mengganti pilihan saat ini dengan buffer.
Misalnya ketika Anda meletakkan ini di .vimrc Anda
kemudian, setelah menyalin sesuatu ke dalam register (yaitu dengan 'y'), Anda cukup memilih teks yang ingin Anda ganti, dan cukup tekan 'r' pada keyboard Anda. Pilihan akan diganti dengan daftar Anda saat ini.
Penjelasan:
sumber
vmap <C-P> "_dP
Vp
mengganti baris Anda saat ini dengan yang disentak segera.d
yang sering digunakan untuk dihapus.Saya memasukkan yang berikut ini di vimrc saya:
Sekarang saya menarik dan memasukkan dari daftar clipboard, dan tidak perlu peduli dengan apa yang terjadi dengan register default. Manfaat tambahan adalah saya dapat menempelkan dari aplikasi lain dengan kerumitan minimal. Saya kehilangan beberapa fungsi, saya tahu, tetapi saya tidak bisa melacak lebih dari satu register / clipboard.
sumber
set clipboard=unnamed
atauset clipboard=unnamedplus
, yang mengubah clipboard default menjadi*
atau+
, masing-masing.Untuk contoh spesifik yang Anda berikan, jika saya mengerti pertanyaannya maka ini mungkin berhasil:
sumber
Semua operasi penarikan dan penghapusan menulis ke register yang tidak disebutkan namanya secara default. Namun, penarikan terakhir dan penghapusan terbaru selalu disimpan (secara terpisah) dalam register bernomor. Register
0
memegang yank terbaru. Register1-9
memegang 9 penghapusan terbaru (dengan1
menjadi yang terbaru).Dengan kata lain, sebuah penghapusan menimpa yank terbaru dalam register yang tidak disebutkan namanya, tetapi itu masih ada di dalam
0
register. Trik daftar"_dd
lubang hitam ( ) yang disebutkan dalam jawaban lain berfungsi karena mencegah menimpa register yang tidak disebutkan namanya, tetapi itu tidak perlu.Anda mereferensikan register menggunakan tanda kutip ganda, sehingga menempelkan teks yang baru-baru ini ditarik bisa dilakukan seperti ini:
Ini adalah referensi yang bagus:
sumber
Untuk menekankan apa yang dikatakan EBGreen :
Jika Anda menempel ketika memilih teks, teks yang dipilih diganti dengan teks yang ditempel.
Jika Anda ingin menyalin beberapa teks lalu menempelkannya di beberapa lokasi, gunakan
"0p
untuk menempelkan. Register bernomor 0 berisi teks dari perintah yank terbaru.Anda juga dapat membuat daftar isi dari semua register Anda:
Perintah itu membuatnya lebih mudah untuk mengetahui register apa yang Anda inginkan ketika melakukan sesuatu seperti jawaban dbr . Anda juga akan melihat register /,%, #. (Lihat juga
:help registers
)Dan akhirnya, periksa
cW
dancW
ubah kata termasuk dan tidak termasuk spasi tambahan. (Menggunakan modalW
termasuk tanda baca.)sumber
Jika Anda menggunakan Vim maka Anda akan memiliki mode visual, yang seperti memilih, tetapi dengan mode pemisahan itu adalah dasar dari vi / vim.
Yang ingin Anda lakukan adalah menggunakan mode visual untuk memilih sumber, lalu menarik, lalu menggunakan mode visual lagi untuk memilih ruang lingkup tujuan, dan kemudian menempelkan ke teks dari buffer default.
Contoh:
Dalam file teks dengan:
dengan urutan berikut:
ggVjyGVkp
Anda akan diakhiri dengan:Dijelaskan:
gg
: buka baris pertamaV
: mulai mode visual dengan seluruh garisj
: turun satu baris (dengan seleksi dimulai pada baris sebelumnya ini menumbuhkan seleksi satu baris ke bawah)y
: tarik ke buffer default (dua baris yang dipilih, dan secara otomatis keluar dari mode visual)G
: pergi ke baris terakhirV
: mulai mode visual (sama seperti sebelumnya)k
: naik satu baris (seperti sebelumnya, dengan mode visual diaktifkan, ini meningkatkan seleksi satu baris ke atas)p
: paste (dengan pilihan pada dua baris terakhir, itu akan mengganti garis-garis itu dengan apa pun yang ada di buffer - 2 baris pertama dalam kasus ini)Ini memiliki sedikit ketidaknyamanan yang menempatkan blok terakhir pada buffer, jadi entah bagaimana tidak diinginkan untuk mengulangi hal yang sama, jadi Anda ingin menyimpan sumber ke buffer bernama dengan sesuatu seperti
"ay
(ke buffer yang disebut "a ") dan rekatkan dengan sesuatu seperti"ap
(tetapi kemudian jika Anda pemrograman, Anda mungkin tidak ingin menempel beberapa kali tetapi untuk membuat fungsi dan menyebutnya, kan? KANAN ?).Jika Anda hanya menggunakan vi, maka Anda harus menggunakan tanda yang tidak terlihat alih-alih mode visual,
:he mark
untuk lebih lanjut tentang ini, saya minta maaf tapi saya tidak terlalu baik dengan hal tanda yang tidak terlihat ini, saya cukup terkontaminasi dengan mode visual.sumber
Untuk 'ganti kata', coba
cw
dalam mode normal.Untuk 'ganti paragraf', coba
cap
dalam mode normal.sumber
c}
dalam mode normal.Solusi invasif minimal untuk yang malas:
Daftar
0
selalu berisi yank terakhir (seperti yang telah disebutkan Rafael , alex2k8 dan idbrii ). Sayangnya memilih register0
sepanjang waktu bisa sangat mengganggu, jadi alangkah baiknya jikap
digunakan"0
secara default. Ini dapat dicapai dengan menempatkan baris berikut ke dalam Anda.vimrc
:Baris pertama memetakan setiap
p
stroke ke"0p
. Namun, ini mencegahp
dari mengakses register lain. Oleh karena itu semuap
goresan dengan register yang dipilih secara eksplisit dipetakan ke ekspresi commandline yang setara dalam for-loop. Hal yang sama dilakukan untukP
.Dengan cara ini perilaku standar dipertahankan, kecuali untuk implisit
p
danP
stroke, yang sekarang menggunakan register0
secara default.Petunjuk 1: Perintah cut sekarang
"0d
bukan hanyad
. Tapi karena saya malas ini terlalu lama bagi saya;) Oleh karena itu saya menggunakan pemetaan berikut:Kunci pemimpin
\
secara default, sehingga Anda dapat dengan mudah memotong teks dengan mengetik\d
atau\D
.Petunjuk 2: Batas waktu default untuk pemetaan multi-kunci cukup singkat. Anda mungkin ingin menambahnya agar memiliki lebih banyak waktu ketika memilih register. Lihat
:help timeoutlen
untuk detail, saya menggunakan:sumber
Baiklah, pertama lakukan perintah ini:
Maka Anda akan menyadari bahwa Anda dapat menghapus ke dalam register tertentu. Dengan begitu Anda tidak akan mengubah apa yang ada di register default Anda.
sumber
["x]d{motion} Delete text that {motion} moves over [into register x]
- Vim:h d
Situasi saya: dalam
Normal
mode, ketika saya menghapus karakter menggunakanx
penekanan tombol, penghapusan itu menimpa register terakhir saya - suntingan yang menyulitkan di mana saya ingin menghapus karakter menggunakanx
dan menempelkan sesuatu yang saya miliki di register terbaru saya (misalnya menempelkan teks yang sama di dua atau lebih banyak tempat).Saya mencoba saran di jawaban yang diterima (
"_d
), tetapi tidak berhasil.Namun, dari jawaban / komentar yang diterima di /vi/122/performing-certain-operations-without-clearing-register , saya menambahkan ini ke my
~/.vimrc
, yang berfungsi (Anda mungkin harus me-restart Vim ):Yaitu, sekarang saya dapat melakukan perintah yank (
y
), delete (d
), dan paste (p
) saya yang normal - dan karakter yang saya hapus menggunakanx
tidak lagi mengisi register yang paling baru.sumber
Teks yang dihapus, saat dalam mode sisipkan, tidak masuk ke register standar.
sumber
Dua solusi yang saya gunakan dalam konteks yang benar adalah;
VISUAL
mode Vims kemudian rekatkan register.Saya menggunakan ini sebagian besar karena kebiasaan karena saya hanya menemukan solusi kedua jauh kemudian, misalnya
<ctrl>+<p>
untuk mengganti register bernomor sebelumnya dengan yang baru saja Anda tempelkan.Pada dasarnya Anda melakukan paste seperti yang Anda inginkan, tetapi ketika Anda menyadari bahwa Anda telah menimpa register default sehingga kehilangan apa yang sebenarnya ingin Anda tempel, Anda dapat
<C-P>
menemukan dan mengganti dari sejarah YankRing!Salah satunya harus memiliki plugin ...
sumber
Saya menemukan pemetaan yang sangat berguna untuk tujuan Anda:
Teks yang dihapus dimasukkan ke dalam "register lubang hitam", dan teks yang ditarik kembali tetap ada.
Sumber: http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text
sumber
Dalam versi windows (mungkin di Linux juga), Anda dapat menarik ke dalam sistem copy / paste buffer menggunakan
"*y
(yaitu mendahului perintah yank Anda dengan tanda kutip ganda dan tanda bintang).Anda kemudian dapat menghapus garis yang dapat diganti secara normal dan menempelkan teks yang disalin menggunakan
"*p
.sumber
Saya sering membuat kesalahan ketika mengikuti perintah 'y'ank, lalu' "_d'elete ke dalam black hole lalu 'p'aste. Saya lebih suka ke' y'ank, lalu hapus sesuka saya, kemudian '" 0p' dari register 0, yang merupakan tempat teks terakhir yang disalin didorong ke.
sumber
Untuk pengguna emacs-evil, fungsi
(evil-paste-pop)
ini dapat dipicu setelah menempel, dan menggilir entri sebelumnya di kill-ring. Dengan asumsi Anda mengikatnya<C-p>
(default di Spacemacs), Anda akan menekanp
diikuti oleh sebanyak yang<C-p>
diperlukan.sumber
Untuk pengguna Dvorak, satu metode yang sangat mudah adalah dengan hanya menghapus teks yang tidak dibutuhkan ke dalam register "1 bukannya" black hole register, jika hanya karena Anda dapat menekan "+ 1 dengan tombol shift yang sama dan gerakan pinky yang cepat karena 1 adalah kunci tepat di atas "di Dvorak (PLUS d ada di sisi lain, yang membuat seluruh perintah cepat sekali).
Maka tentu saja, register "1 dapat digunakan untuk hal-hal lain karena kenyamanannya, tetapi kecuali jika Anda memiliki tujuan yang lebih umum daripada mengganti teks, saya akan mengatakan itu adalah penggunaan register yang cukup baik.
sumber
Bagi Anda yang tertarik untuk tidak menimpa register yang tidak disebutkan namanya saat Anda mengganti teks melalui seleksi virtual dan tempel.
Anda dapat menggunakan solusi berikut ini yang mudah dan paling cocok untuk saya:
xnoremap <expr> p 'pgv"'.v:register.'y'
Ini dari jawaban (dan komentar) di sini: Cara menempel tanpa mendaftar ulang
Ini melewati seleksi pertama, lalu pemilihan dengan teks baru dipilih lagi (gv). Sekarang register yang terakhir digunakan dalam mode visual (biasanya register yang tidak disebutkan namanya tetapi berfungsi juga efek samping gratis jika Anda menggunakan register lain untuk menempel). Dan kemudian tarik nilai baru ke register lagi.
PS: Jika Anda memerlukan varian yang lebih sederhana yang bekerja juga dengan plugin intellj idea vim-simulasi, Anda dapat menggunakan yang ini (downside: timpa register yang tidak disebutkan namanya meskipun ada register lain yang diberikan untuk ditempelkan):
vnoremap p pgvy
sumber
Bagi mereka yang menggunakan JetBrans IDE (PhpStorm, WebStorm, IntelliJ IDEA) dengan IdeaVim. Anda mungkin mengalami masalah dengan memetakan suka
nnoremap d "_d
dan menggunakannya untuk menghapus garisdd
. Solusi yang mungkin untuk Anda:nnoremap dd "_dd
Ada masalah di youtrack, silakan pilih: https://youtrack.jetbrains.com/issue/VIM-1189 https://youtrack.jetbrains.com/issue/VIM-1363
sumber
Preferensi Vim sesekali untuk kompleksitas daripada kepraktisan membebani pengguna dengan menerapkan register untuk menyalin / menghapus tindakan - ketika lebih sering daripada tidak, seseorang hanya ingin menempelkan apa yang disalin dan "melupakan" apa yang telah dihapus.
Namun, alih-alih melawan register rumit vim, buat mereka lebih nyaman: pilih register "default" untuk menyimpan penghapusan terbaru Anda. Sebagai contoh, kirim penghapusan ke register d (membiarkan ac terbuka untuk penggunaan ad-hoc; d adalah mnemonik yang bagus):
Pendekatan ini mencegah penghapusan dari mencabut yanks TETAPI tidak kehilangan mendaftarkan penghapusan - seseorang dapat menempel (kembali) apa yang telah dihapus alih-alih kehilangannya dalam lubang hitam (seperti dalam jawaban yang diterima). Dalam contoh di atas, penarikan kembali ini dilakukan dengan dua pemetaan pemimpin. Manfaat dari pendekatan ini, adalah memberi Anda kemampuan untuk memilih apa yang akan ditempel: (a) apa yang baru saja dicabut, atau (b) apa yang baru saja dihapus.
sumber
daftar 0 sampai 9 adalah hal-hal terbaru yang Anda tarik atau potong dll, dan JANGAN termasuk hal-hal yang dihapus dll. Jadi jika Anda menarik / memotong sesuatu, itu ada dalam daftar 0 juga, bahkan jika Anda mengatakan hal-hal yang dihapus sepanjang hari setelah itu, daftar 0 masih hal terakhir yang kamu tarik / potong.
yiw #harus mendaftar secara default, dan mendaftar 0
itu menarik kata kursor masuk
barang yang dihapus dll akan masuk ke daftar default, tetapi TIDAK mendaftar 0
dalam mode standar:
"0p # masukkan isi register 0
dalam mode sisipkan:
ctrl-r 0 # masukkan konten register 0
Saya juga punya teman yang selalu mencabut / memotong untuk mendaftar x lol.
sumber