在 Vim 中,我可以
:set wrapscan
这样,当我进行增量搜索时,无论第一个匹配项位于光标上方还是下方,光标都会跳转到第一个匹配项。
在 Emacs 中,如果我通过
C-s
开始搜索,如果第一个匹配项位于光标上方,则搜索失败,并显示 Failing I-search。如果我再次点击 C-s
,它就会包装搜索,并显示 Wrapped I-search。如何像 Vim 中那样默认换行和跳转光标,而无需再次 C-s
?
最简单的方法是使用以下默认设置:
(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)))
当 Isearch 失败时,它会立即尝试换行。请注意,暂时禁用此默认设置非常重要,以防止在没有匹配项时出现无限循环。
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)))
将
isearch-wrap-pause
设置为 no
。
https://www.gnu.org/software/emacs/manual/html_node/emacs/Repeat-Isearch.html
我发现这个解决方案对我(前 Vim 用户)来说是完美的。它使 isearch 像 Vim 一样工作。只需按一下 C-s / C-r
即可实现自动环绕以及切换搜索方向