Bagaimana cara menghapus (tidak memotong) di Vim?


145

Bagaimana saya bisa menghapus garis tanpa memasukkannya ke dalam buffer default saya?

Contoh:

line that will be copied.

line that I want to be substitued with the previous one.

Apa yang saya coba lakukan:

yy
dd
p

Tetapi Vim menggantikan string yang baru-baru ini disalin dengan yang dihapus (terpotong). Saya tahu bahwa saya dapat menggunakan buffer seperti, "1yy, ddkemudian "1p, tapi aku selalu lupa untuk menempatkan string disalin dalam buffer maka saya perlu paste isi pertama saya (baris yang akan disalin) dan kemudian menghapus apa yang saya inginkan (baris yang saya inginkan untuk diganti dengan yang sebelumnya.)

Bagaimana saya bisa benar-benar menghapus teks di Vi (m) tanpa menyalinnya?

Pertanyaan terkait lainnya adalah bagaimana saya bisa meneruskan menghapus kata dalam mode penyisipan? Saya ingin sesuatu yang mirip dengan Ctrl+ w.


Jawaban:


130

Gunakan "hitam lubang mendaftar", "_untuk benar-benar menghapus sesuatu: "_d.
Gunakan "_dPuntuk menempelkan sesuatu dan tetap tersedia untuk menempel lebih lanjut.

Untuk pertanyaan kedua, Anda bisa menggunakan <C-o>dw. <C-o>digunakan untuk menjalankan perintah normal tanpa meninggalkan mode sisipkan .

Anda dapat mengatur pemetaan Anda sendiri untuk menyimpan pengetikan, tentu saja. Saya punya ini:

nnoremap <leader>d "_d
xnoremap <leader>d "_d
xnoremap <leader>p "_dP

Terima kasih, Anda menjawab kedua pertanyaan saya. Tapi saya tidak mengerti bagaimana perintah noremap ini akan membantu saya. Apakah saya kehilangan fungsi potong, kan?
MaikoID

3
Tidak, dmasih "memotong" dan pmasih "pasta", sementara <leader>dmenghapus nyata dan <leader>pmembuang teks yang dipilih dan menempel konten dari register default. <leader>pmemungkinkan saya untuk menempelkan teks yang sama beberapa kali tanpa harus menggunakan register bernama.
romainl

119

Daftar lubang hitam "_ akan melakukan trik, tetapi ada solusi yang lebih baik:

Ketika Anda memasukkan baris kembali dengan pperintah Anda menempelkan isi register default (volatile) "", yang telah ditimpa oleh dd. Tetapi Anda masih dapat menempel dari register yank (non volatile) "0, yang tidak akan ditimpa oleh perintah delete dd.

Jadi ini adalah perintah yang ingin Anda gunakan sesuai contoh Anda:

yy
dd
"0p

1
Hebat, ini seharusnya jawaban yang diterima. Jauh lebih mudah untuk menentukan register secara manual setiap kali saya ingin menempel daripada terus menentukan register setiap kali saya menghapus apa pun.
JShorthouse

44

Itulah salah satu hal yang saya tidak suka tentang vim ... Saya akhirnya memetakan ddke register lubang hitam di .vimrc saya dan hidup sudah baik sejak:

nnoremap d "_d
vnoremap d "_d

6
lalu bagaimana Anda memotong?
VitalyB

11
v/Vdengan xjuga dipotong. Dan memotong dengan xjuga koheren dengan Ctrl + xOS apa pun.
WesternGun

22

pemetaan berikut akan menghasilkan:

  • d => "hapus"
  • pemimpin d => "potong"
nnoremap x "_x
nnoremap d "_d
nnoremap D "_D
vnoremap d "_d

nnoremap <leader>d ""d
nnoremap <leader>D ""D
vnoremap <leader>d ""d

Selain itu, praktik yang baik untuk menyetel kunci "leader" menjadi koma, misalnya:

let mapleader = ","
let g:mapleader = ","

2 snippet ini akan menjadikan ", d" menjadi perintah cut baru Anda.

Jika Anda ingin menggunakan pemetaan ini untuk bersama dengan konfigurasi clipboard sistem bersama, lihat detail lebih lanjut di https://github.com/pazams/d-is-for-delete


Saya berharap saya dapat memilih jawaban ini lebih dari satu kali - saya menggunakan jawaban kprobst tetapi kemudian untuk memotong garis, saya harus menggunakan yyddyang agak tidak berkelanjutan di jari saya ;-).
Tahir Hassan

1
Ide intellij bertingkah aneh setelah ini. dd tidak melakukan apa-apa. , d tidak melakukan apa pun
s1n7ax

Saya suka solusinya. Satu hal yang tidak berhasil bagi saya - adalah memotong garis dengan ,dd. Setelah menambahkannya nnoremap <leader>dd ""ddmulai bekerja
Alexey

8

Anda dapat menggunakannya "_duntuk mencegah hal-hal yang menimpa teks yang Anda tarik. Anda dapat menyimpan teks yang ditarik atau dihapus dalam register apa pun yang Anda inginkan ", dan _merupakan register 'lubang hitam', tempat Anda mengirim barang yang tidak Anda pedulikan.

Untuk informasi lebih lanjut, Anda dapat mengetik :help "_atau:help deleting


-1
yy
Vx
p

Ketika dalam mode visual, xakan menghapus pilihan, jadi jika Anda ingin menghapus seluruh baris, pertama tekan Vuntuk memilih garis dalam mode visual dan kemudian tekan xuntuk menghapus pilihan.


3
Ini menyalin baris yang dihapus ke clipboard yang persis apa yang ingin OP hindari.
aVeryStableGenius

Terima kasih! Entah bagaimana ini bekerja dengan baik pada plugin Emacs Evil
Pedro Penna
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.