You have no idea how powerful isearch is!
isearch
is probably one of the most widely known Emacs commands. Every Emacs user
knows that they can run it using C-s
(to search forward) and C-r
to search backwards.
Everyone also knows they can keep pressing C-s
and C-r
to go over the list of matches
in the current buffer. Even at this point that’s a very useful command. But that doesn’t
even scratch the surface of what isearch
can do!
After you’ve started isearch
you can actually do a lot more than pressing C-s
and C-r
:
- Type
DEL
to cancel last input item from end of search string. - Type
RET
to exit, leaving point at location found. - Type LFD (
C-j
) to match end of line. - Type
M-s M-<
to go to the first match,M-s M->
to go to the last match. (super handy) - Type
C-w
to yank next word or character in buffer onto the end of the search string, and search for it. (very handy) - Type
C-M-d
to delete character from end of search string. - Type
C-M-y
to yank char from buffer onto end of search string and search for it. - Type
C-M-z
to yank from point until the next instance of a specified character onto end of search string and search for it. - Type
M-s C-e
to yank rest of line onto end of search string and search for it. - Type
C-y
to yank the last string of killed text. - Type
M-y
to replace string just yanked into search prompt with string killed before it. - Type
C-q
to quote control character to search for it. - Type
C-x 8 RET
to add a character to search by Unicode name, with completion. C-g
while searching or when search has failed cancels input back to what has been found successfully.C-g
when search is successful aborts and moves point to starting point.
You can also toggle some settings write isearch
is active:
- Type
M-s c
to toggle search case-sensitivity. - Type
M-s i
to toggle search in invisible text. - Type
M-s r
to toggle regular-expression mode. - Type
M-s w
to toggle word mode. - Type
M-s _
to toggle symbol mode. - Type
M-s '
to toggle character folding.
Type M-s SPC
to toggle whitespace matching.
In incremental searches, a space or spaces normally matches any whitespace
defined by the variable search-whitespace-regexp
; see also the variables
isearch-lax-whitespace
and isearch-regexp-lax-whitespace
.
Type M-s e
to edit the search string in the minibuffer. That one is super useful!
Also supported is a search ring of the previous 16 search strings:
- Type
M-n
to search for the next item in the search ring. - Type
M-p
to search for the previous item in the search ring. - Type
C-M-i
to complete the search string using the search ring.
Last, but not least - you can directly search for the symbol/thing at point:
- Type
M-s .
to search for the symbol at point. (useful in the context of programming languages) - Type
M-s M-.
to search for the thing (e.g. word or symbol) at point.
One of the most useful parts of that is the fact that a region is a thing.
So you can mark a region (e.g. with expand-region
or mark-*
) and M-s M-.
to
immediately search for other instances of that text. Powerful stuff!
Tip: You don’t really have to remember all those keybindings - just remember you can press C-h b
to show them. (after you’ve started isearch
)
Most of the above text is coming straight from the docstring of isearch
. It’s funny that I’ve
been using Emacs for almost 20 years, I use isearch
numerous times every day and I still often
forget about much of its functionality.
There’s more to isearch
, though. Did you know it’s widely customizable as well? If you check
its options with M-x customize-group isearch
you’ll see there are over 30 (!!!) options there!
Admittedly, I never used any of them, but you’ve got quite a lot of opportunities to tweak the
behavior of isearch
if you want to. Here’s an example of a customization some of you might
find useful:
;; When isearching, enable M-<, M->, C-v and M-v to skip between matches
;; in an intuitive fashion. Note that the `cua-selection-mode' bindings
;; for C-v and M-v bindings are not supported.
(setq isearch-allow-motion t
isearch-motion-changes-direction t)
I hope you learned something useful today! Keep searching (the Emacs docs)!