252

How can I delete a line without putting it into my default buffer?

Example:

line that will be copied.

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

What I'm trying to do:

yy
dd
p

But Vim replaces the recent copied string with the deleted (cutted) one. I know that I can use buffers like, "1yy, dd then "1p, but I always forget to put the copied string in a buffer then I need to paste my contents first (line that will be copied) and then delete what I want (line that I want to be substituted with the previous one.)

How can I really delete a text in Vi(m) without copying it?

Another related question is how I can forward delete a word in insert mode? I want something similar to Ctrl+w.

Mateusz Piotrowski
  • 8,029
  • 10
  • 53
  • 79
MaikoID
  • 4,359
  • 4
  • 25
  • 27
  • 5
    possible duplicate of [In vim is there a way to delete without putting text in the register?](http://stackoverflow.com/questions/54255/in-vim-is-there-a-way-to-delete-without-putting-text-in-the-register) – eckes Aug 17 '12 at 12:37

9 Answers9

261

The black hole register "_ will do the trick, but there is a better solution:

When you enter the line back with the p command you are pasting the contents of the (volatile) default register "", which has been overwritten by dd. But you still can paste from the (non volatile) yank register "0, which won't be overwritten by the delete command dd.

So these are the commands you want to use as per your example:

yy
dd
"0p
cutemachine
  • 5,520
  • 2
  • 33
  • 30
  • 9
    Great, this should be the accepted answer. It's much easier to manually specify a register whenever I want to paste than to keep specifying a register every time I delete anything. – JShorthouse Dec 16 '19 at 17:32
  • 9
    `"0p` does not exactly roll off the fingertips but I think I can get accustomed to this! – jrz Feb 25 '22 at 16:26
  • 3
    @Jonz I would visually remember it like this. https://imgur.com/sQ2k0NI – Prasanna Sep 06 '22 at 15:35
198

Use the "black hole register", "_ to really delete something: "_d.
Use "_dP to paste something and keep it available for further pasting.

For the second question, you could use <C-o>dw. <C-o> is used to execute a normal command without leaving the insert mode.

You can setup your own mappings to save typing, of course. I have these:

nnoremap <leader>d "_d
xnoremap <leader>d "_d
xnoremap <leader>p "_dP
M. Gruber
  • 351
  • 3
  • 10
romainl
  • 186,200
  • 21
  • 280
  • 313
  • thx, you answer my both questions. But I didn't understand how these noremap commands will help me. Am I losing the cut function, right ? – MaikoID Aug 16 '12 at 19:28
  • 4
    No, `d` still "cuts" and `p` still "pastes", while `d` deletes for real and `p` throws away the selected text and pastes the content of the default register. `p` allows me to paste the same text multiple times without having to use named registers. – romainl Aug 16 '12 at 20:04
  • Don't you mean `nnoremap d "_dd` and `xnoremap d "_dd`? As it is now, it waits for the next sequence. – Amir Shabani Oct 07 '21 at 09:16
  • 1
    @AmirA.Shabani this is intended. The point of those `d` mappings is not to be alternatives to `dd` but to be alternatives to `d`, which waits for a motion. – romainl Oct 07 '21 at 09:32
  • Holy cow I can't believe I never new about ``. Rad! – twhitney May 02 '22 at 22:35
  • You can just add `noremap "_`. With this you keep unchanged your clipboard by pressing your leader key before deleting, yanking or changing – Victor Oct 02 '22 at 07:12
68

That's one of the things I disliked about vim... I ended up mapping dd to the black hole register in my .vimrc and life has been good since:

nnoremap d "_d
vnoremap d "_d
kprobst
  • 16,165
  • 5
  • 32
  • 53
41

the following mappings will produce:

  • d => "delete"
  • leader d => "cut"
nnoremap x "_x
nnoremap d "_d
nnoremap D "_D
vnoremap d "_d

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

Also, it is a nice practice to have the "leader" key set to comma, e.g:

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

these 2 snippets will make ",d" be your new cut command.

If you would like to use these mappings togther with a shared system clipboard configuration, see further details at https://github.com/pazams/d-is-for-delete

pazams
  • 969
  • 1
  • 8
  • 10
  • 2
    I wish I could upvote this answer more than once -- I was using kprobst's answer but then to cut a line, I had to use `yydd` which was a bit unsustainable on my fingers `;-)`. – Tahir Hassan May 21 '18 at 13:14
  • 3
    intellij idea acting so weird after this. dd does nothing. ,d does nothing – s1n7ax Jan 26 '19 at 06:29
  • 2
    I like the solution a lot. One thing that didn't work for me - is cutting lines with `,dd`. After adding `nnoremap dd ""dd` it started to work – Alexey Nov 28 '19 at 07:52
  • I'm also having some problems in Intellij with ideavim plugin. The second part, it's not working :( – Victor Oct 02 '22 at 07:15
  • Setting the leader key to "," overwrites its "find previous" functionality which is a core feature of movement. I don't recommend it. Mapping leader to space (" ") gives a much better UX. – Ryan Fisher Aug 24 '23 at 23:10
10

You can use "_d to prevent things from overwriting your yanked text. You can store yanked or deleted text in whatever register you want with ", and _ is the 'black hole' register, where you send stuff that you don't care about.

For more information you can type :help "_ or :help deleting

pb2q
  • 58,613
  • 19
  • 146
  • 147
Alex
  • 14,973
  • 13
  • 59
  • 94
1

I use noremap ' "_ in my .vimrc

This keep the behavior of dd, so I can use it to cut as before.

But when I really want to delete something, just use the prefix '. For example: 'dd,'dw

qz3065863
  • 11
  • 1
0
yy
Vx
p

When in visual mode, x will delete the selection, so if you want to delete a whole line, first press V to select the line in visual mode and then press x to delete the selection.

Atemu
  • 295
  • 3
  • 12
0

I ended up with

nnoremap p "0p
nnoremap P "0P
vnoremap p "0p
vnoremap P "0P
vnoremap x "0x
nnoremap x "0x

Always paste from the 0 register instead of the unnamed one. Use x in visual mode to delete into the 0 register.

mowwwalker
  • 16,634
  • 25
  • 104
  • 157
0

There is another solution. That consists in copying line to copy over line to delete, like this.

Put the cursor at the begin of line of line to copy and then enter ddVp

  • dd kill the line to be copied
  • V select the whole line to be replaced with
  • p paste the killed line over the visual selection

Now the killed line is in "1 register, and the copied line is in "2 register. Nothing is lost.

I use vim 9, I don't know for which older vim version that works. If that doesn't work, you can put these lines in your .vimrc:

" Make p in Visual mode replace the selected text with the "" register. vnoremap p <Esc>:let current_reg = @"<CR>gvdi<C-R>=current_reg<CR><Esc>

enikar
  • 1
  • 1