tags:

views:

225

answers:

1

In Vim I can :set wrapscan so that when I do an incremental search, the cursor jumps to the first match whether the first match is above or below the cursor.

In Emacs, if I start a search via C-s, the search fails saying Failing I-search if the first match is above the cursor. If I hit C-s again it then wraps the search, saying Wrapped I-search. How do I wrap and jump the cursor by default as in Vim, without having to C-s a second time?

EDIT: jurta's answer got me most of the way there. Thanks jurta! This is the behavior I wanted:

(defadvice isearch-search (after isearch-no-fail activate)
  (unless isearch-success
    (ad-disable-advice 'isearch-search 'after 'isearch-no-fail)
    (ad-activate 'isearch-search)
    (isearch-repeat (if isearch-forward 'forward))
    (ad-enable-advice 'isearch-search 'after 'isearch-no-fail)
    (ad-activate 'isearch-search)))
+6  A: 

The easiest way to do this is to use the following defadvice:

(defadvice isearch-repeat (after isearch-no-fail activate)
  (unless isearch-success
    (ad-disable-advice 'isearch-repeat 'after 'isearch-no-fail)
    (ad-activate 'isearch-repeat)
    (isearch-repeat (if isearch-forward 'forward))
    (ad-enable-advice 'isearch-repeat 'after 'isearch-no-fail)
    (ad-activate 'isearch-repeat)))

When Isearch fails, it immediately tries again with wrapping. Note that it is important to temporarily disable this defadvice to prevent an infinite loop when there are no matches.

link0ff
Thanks, I see how this is supposed to work, but it doesn't seem to do anything. The function isearch-no-fail doesn't exist in my Emacs. I grepped all the Emacs source code and it's not in there.
Brian Carper
isearch-no-fail is just a name of this defadvice, you can change it to anything you want. I tested this code in GNU Emacs 22 and GNU Emacs 23, and it works exactly as you described. Could you provide more details to understand why it doesn't work for you?
link0ff
Never mind, I don't know where my mind was. It does work, but it was slightly different than what I wanted. I wanted it to wrap the search as I typed, without hitting C-s again at all. Thanks!
Brian Carper