Автоматическая упаковка I-search?
В Vim я могу :set wrapscan
, так что, когда я делаю инкрементный поиск, курсор переходит к первому совпадению, находится ли первое совпадение выше или ниже курсора.
В Emacs, если я начну поиск с помощью C-s
, поиск не будет выполнен с ошибкой, говоря Fail I-search, если первое совпадение находится над курсором. Если я снова нажму C-s
, он затем обернет поиск, указав "Обернутый I-поиск". Как поместить и переместить курсор по умолчанию, как в Vim, без повторения C-s
?
Ответы
Ответ 1
Самый простой способ сделать это - использовать следующую 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)))
Когда Isearch терпит неудачу, он сразу же пытается снова обернуть. Обратите внимание, что важно временно отключить эту defadvice, чтобы предотвратить бесконечный цикл, когда нет совпадений.
Ответ 2
Ответ 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)))