Emacs: Search Current Word 🚀

By Xah Lee. Date: . Last updated: .

Problem with Emacs's isearch

Emacs's “isearch” command have inconvenience problem of searching the current word.

Suppose you have this line:

aa-bb-▮cc xx yy

and your cursor is on the second hyphen. You want to search the next occurrence of the word “aa-bb-cc”. You have to press Alt+b Alt+b Ctrl+s Ctrl+w Ctrl+w Ctrl+w Ctrl+s. That's about 8 keys. In vim, it's just a single key press *.

addendum: Emacs 24.4 (Released 2014-10) has the new command isearch-forward-symbol-at-point that improved the situation but still pretty bad. Now to search current word under cursor, you need to press Alt+s . Alt+s _ Ctrl+s. [see Emacs: Search Text in Current File] Besides the too-many-keys problem, this command has more problems:

  1. isearch-forward-symbol-at-point is on “symbols” only. What chars are part of “symbol” is unpredictable, mode-dependent.
  2. The search is with boundary check. That is, if current symbol is “xx”, it'll will not find occurrences of “xx2”.

Command to Search Current Word

Here's a command to isearch the word under cursor.

(defun xah-search-current-word ()
  "Call `isearch' on current word or selection.
“word” here is A to Z, a to z, and hyphen [-] and lowline [_], independent of syntax table.

URL `http://xahlee.info/emacs/emacs/modernization_isearch.html'
Version: 2015-04-09"
  (let (xp1 xp2)
    (if (region-active-p)
        (setq xp1 (region-beginning) xp2 (region-end))
        (skip-chars-backward "-_A-Za-z0-9")
        (setq xp1 (point))
        (skip-chars-forward "-_A-Za-z0-9")
        (setq xp2 (point))))
    (setq mark-active nil)
    (when (< xp1 (point))
      (goto-char xp1))
    (isearch-mode t)
    (isearch-yank-string (buffer-substring-no-properties xp1 xp2))))

You need to give it a easy key. Such as F8. [see Emacs Keys: Define Key]

Also, you should set your isearch repeat to arrow keys. Emacs Init: isearch by Arrow Keys.

Emacs Find Replace

Emacs Modernization