tags:

views:

180

answers:

5

When I use VIM or most modeless editors (Eclipse, NetBeans etc.) I frequently do the following. If I have similar text blocks and I need to change them all, I will change one, copy it (or use non-deleting yank), select next block I need and paste the changed version over it. If I do the same thing in emacs (select region and paste with C-y), it doesn't replace the region, it just pastes at the cursor position. What is the way to do this in emacs?

+8  A: 

Add this to your .emacs:

(delete-selection-mode 1)

Anything that writes to the buffer while the region is active will overwrite it, including paste, but also simply typing something or hitting backspace

Michael Mrozek
+2  A: 

The default way to do something like this is the not-entirely-elegant following:

  1. Get your desired replacement text into the kill ring somehow (e.g., M-w).
  2. Highlight the region to be replaced.
  3. Delete it (C-w).
  4. Replace it with the prior-copied region (C-y, M-y). This replaces the freshly deleted contents with the exact same text that you just deleted (C-y), and then re-replaces it with the next most-recently saved buffer in the buffer ring (M-y).

This would get to be a real pain if you wanted to do this 10 times with the same text, as the desired replacement would get pushed farther back in the kill ring each time you deleted a region, so you'd have to call M-w an increasing number of times each time you wanted to yank it.

I've also just discovered M-x delete-region, thanks to http://stackoverflow.com/questions/637351/emacs-how-to-delete-text-without-kill-ring. As the question implies, this deletes the offending text without putting it into the kill ring, avoiding the problem of pushing your replacement text further down on the stack. And, as the relevant response mentions, you can bind this to a shortcut key of your choosing.

BobS
A: 

If you enable CUA-mode, this paste over selected region becomes the normal behaviour.

+3  A: 

Setting delete-selection-mode, as Michael suggested, seems the most natural way to do it.

However, that's not what I do :) Instead, I put the good stuff into a "register" -- for eample, register "a" -- with C-x r x a. Then I kill the other copy, and copy the register into the same spot with C-x r g a.

This is convenient because killing doesn't affect the registers, so C-x r g a always inserts the good stuff.

offby1
A: 

The way I do this is:

  • go to where you want the new stuff
  • paste the good stuff
  • your cursor is now between the new stuff and the stuff you want to get rid of
  • select forward until everything you want to get rid of is selected
  • delete it

It's a slightly different way of thinking about it. Paste what you want, then get rid of what you don't want, rather than replace what you don't want with what you do.

Singletoned