Melakukan operasi tertentu tanpa menghapus register


30

Seringkali, dalam file konfigurasi saya dapat menyalin dan menempel blok baris, maka saya ingin membuat perubahan kecil pada blok itu. Setelah menempel, saya gunakan xuntuk menghapus karakter yang ingin saya hapus, kemudian pindah untuk menempelkan blok berikutnya. Kecuali xmenempatkan karakter yang dihapus di clipboard, jadi saya harus menyalin kembali blok garis.

Apakah ada cara untuk melakukan ini tanpa masuk ke mode insert?


Jawaban:


35

Pilihan Anda adalah:

  1. Gunakan register lubang hitam _. Misalnya, untuk menghapus garis yang Anda ketikkan "_dd. Ini dihapus tanpa mempengaruhi clipboard.
  2. Secara eksplisit beri nama register untuk menarik asli. Misalnya, untuk menarik garis ke dalam register bernama Anda akan mengetik "ayylalu menempelkan Anda akan mengetik"ap
  3. Gunakan register yank sebagai gantinya untuk mengambil yank yang asli. Anda dapat menarik, lalu menghapus seperlunya, lalu ketika Anda pergi ke jenis tempel"0p
  4. Gunakan plugin seperti vim-easyclip untuk menyediakan operator potong yang berbeda dari operator hapus (pengungkapan penuh: saya menulis itu)

Jalankan :help registersuntuk lebih detail pada 3 pertama


4
Jadi untuk xsaya gunakan "_x?
durron597

1
Itu benar.
Steve Vermeulen

2
@ durron597 jika Anda menghapus satu karakter pada satu waktu x, Anda mungkin harus belajar untuk menghapus gerakan seperti dt)yang dihapus sampai tanda kurung tutup berikutnya d2Wyang menghapus dua token yang dipisahkan spasi putih berikutnya. Maka Anda mungkin melakukan sesuatu seperti "_di{di dalam wilayah yang diperkuat, yang merupakan sesuatu yang saya lakukan sepanjang waktu. Dalam mode normal ini berarti " delete segala sesuatu di dalam ini menguatkan daerah ke dalam lubang hitam "
OregonTrail

Ditambahkan nnoremap x "_xke saya ~/.vimrc(penjelasan di sini: stackoverflow.com/questions/54255/… ).
Victoria Stuart

11

xtidak meletakkan barang-barang di clipboard, itu menempatkan mereka ke dalam register . Jika Anda tidak memberi tahu register mana yang akan dimasukkan, ia memasukkannya ke dalam register yang tidak disebutkan namanya, yang tentu saja menimpa konten sebelumnya. Jadi, sebagai gantinya, beri tahu register mana yang harus digunakan " REGISTER x:, di mana REGISTER adalah huruf tunggal. Anda kemudian menggunakan awalan daftar kutipan yang sama puntuk menempel dari daftar itu. (Catatan: huruf kecil menggantikan kontennya; huruf besar ditambahkan).

Ada juga dua register khusus "0dan "1. "0adalah yteks yang paling lama ditarik ( ), yang akan tetap ada bahkan jika Anda menghapus beberapa teks dengan perintah lain (seperti x). "1adalah teks yang paling baru dihapus, selama teks itu tidak kecil (satu baris). Teks yang dihapus kecil masuk "-.

Akhirnya, seperti yang ditunjukkan Steve Vermeulen, Anda dapat memberitahu vim untuk tidak menyimpan teks yang dihapus dengan menentukan register lubang hitam "_.

Perintah bantuan yang relevan adalah :help registers.


3

The :letperintah akan membiarkan Anda mendefinisikan sebuah register bernama. Pada baris perintah vim, menekan Control+ R dua kali 1 dan kemudian nama register akan menempelkan isi register ke dalam perintah. Kemudian Anda dapat memodifikasi apa yang ditempelkan, dan menyimpan daftar dengan modifikasi Anda.

Contoh:

  • Dalam mode normal, pada baris yang berisi teks "Foo Bar", ketikkan "fyyseluruh baris ( yy) ke fregister ( "f).
  • Ketik :let @f=', dan Control+ r, Control+ rlagi, lalu f, dan Anda akan melihatnya menempel di "Foo Bar", jadi baris perintah Anda sekarang membaca :let @f='Foo Bar, dengan kursor di bagian paling akhir.
  • Sekarang Anda dapat menggunakan panah dan menghapus kunci untuk mengedit apa yang baru saja Anda tempel, seperti :let @f='foo bar baz.
  • Akhiri kutipan: :let @f='foo bar baz'dan tekan Enter.

Sekarang Anda telah mendefinisikan ulang isi fregister menjadi "foo bar baz".

(Ini juga berfungsi untuk makro! :help letUntuk informasi lebih lanjut.)


1 Control + rmemungkinkan Anda memasukkan register saat Anda sudah dalam mode insert, seolah-olah Anda sedang mengetik karakter. Menggunakan urutan ini dua kali penting karena "teks dimasukkan secara harfiah, tidak seperti diketik. Ini berbeda ketika register berisi karakter seperti <BS>." - vimdoc insert.txt,:help i_CTRL-R_CTRL-R


0

Terkait dengan daftar blackhole yang "_disebutkan oleh @derobert, Anda dapat menemukan screencast yang berguna di http://vimcasts.org/episodes/meet-the-yank-register/

Vim menggunakan istilah delete, yank, dan put, menggantikan terminologi standar cut, copy, dan paste. Dimulai dengan huruf yang sama, pasang dan tempel mudah dipertukarkan. Setelah Anda terbiasa dengan kata yank, itu menjadi identik dengan salinan. Tetapi penggunaan Vim pada kata 'delete' bermasalah. Dalam kebanyakan konteks, kata delete hanya berarti menghapus. Tetapi operasi penghapusan Vim menyalin teks ke dalam register, kemudian menghapusnya dari dokumen. Dengan kata lain, operasi penghapusan Vim berperilaku seperti potongan.


2
Ini tidak memberikan jawaban untuk pertanyaan itu. Untuk mengkritik atau meminta klarifikasi dari penulis, tinggalkan komentar di bawah posting mereka - Anda selalu dapat mengomentari posting Anda sendiri, dan begitu Anda memiliki reputasi yang cukup, Anda akan dapat mengomentari setiap posting .
jamessan

Saya mencoba mengomentari posting asli tetapi saya tidak bisa. Satu-satunya alternatif yang saya miliki adalah yang saya pilih @ jamess
Marlon León

0

Plugin ReplaceWithRegister

http://www.vim.org/scripts/script.php?script_id=2703 (2009-2014)

Ini menyarankan pemetaan gr.

  1. merenggut
  2. pilih secara visual teks yang ingin Anda ganti dan tekan gr
  3. pindah ke blok berikutnya yang ingin Anda ganti

Atau, gunakan gr<text object>untuk melakukannya tanpa pemilihan visual. dot-repeat didukung ketika plugin repeat.vimoleh Tim Pope dan visualrepeat.vimoleh Ingo Karkat diinstal.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.