自动包装I-search?

Bri*_*per 23 emacs search

在Vim中我可以:set wrapscan这样,当我做一个增量搜索,光标跳到第一个匹配的第一个匹配是否高于或低于该光标.

在Emacs的,如果我开始通过搜索C-s,搜索失败说做不到我的搜索,如果第一场比赛光标上面.如果我C-s再次点击它然后包装搜索,说Wrapped I-search.默认情况下如何在Vim中包装和跳转光标,而不必C-s第二次?

lin*_*0ff 16

最简单的方法是使用以下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)))
Run Code Online (Sandbox Code Playgroud)

当Isearch失败时,它会立即再次尝试包装.请注意,暂时禁用此defadvice以防止无匹配时的无限循环非常重要.

  • 此解决方案具有令人讨厌的副作用,要求您按两次退格键以删除无法匹配的第一个字符. (2认同)

Chr*_*tin 8

Jurta 的回答已经差不多了。这是想要的行为:

;; Prevents issue where you have to press backspace twice when
;; trying to remove the first character that fails a search
(define-key isearch-mode-map [remap isearch-delete-char] 'isearch-del-char)

(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)))
Run Code Online (Sandbox Code Playgroud)