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.

MaikoID
sumber

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
romainl
sumber
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
Cutemachine
sumber
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
kprobst
sumber
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

pazams
sumber
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

Alex
sumber
-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.

Atemu
sumber
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