How to replace current word under cursor in Emacs
Incremental search has this feature, but the replace functions don't. Fortunately, incremental search does have a way to switch to replace mode once you've selected a search term. So:
- Press C-s to switch to incremental search mode
- Press C-w to yank the current word into the search buffer. You can keep pressing it to append multiple words, and you can also use C-M-y to yank individual characters and C-y to yank whole lines
- Press M-% to switch to replace mode using the search buffer you've already constructed
As you probably know from using M-% normally, this is a query replace mode where it prompts you for what to do with each match. If you just want to replace them all, hit ! on the first match.
;; query-replace current word
(defun qrc (replace-str)
(interactive "sDo query-replace current word with: ")
(forward-word)
(let ((end (point)))
(backward-word)
(kill-ring-save (point) end)
(query-replace (current-kill 0) replace-str) ))
Use copy-paste: M-d C-_ M-x replace-string RET C-y
(kill-word
, undo
, replace-string
, yank
). If you've already started the replacement, you can switch back to the original buffer to do the copy-paste with the usual window or buffer switching commands: M-x replace-string RET … C-x o M-d C-_ C-x o C-y
. You can use a prefix argument on M-d
(e.g. ESC 4 2 M-d
) to replace multiple words.
If you're planning to replace one or more words at the cursor, you can instead start from incremental search (C-s
), use C-w
to start searching the word under the cursor, then press M-%
to switch to replace-string
.