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.