Подтвердить что ты не робот

Автоматическая упаковка I-search?

В Vim я могу :set wrapscan, так что, когда я делаю инкрементный поиск, курсор переходит к первому совпадению, находится ли первое совпадение выше или ниже курсора.

В Emacs, если я начну поиск с помощью C-s, поиск не будет выполнен с ошибкой, говоря Fail I-search, если первое совпадение находится над курсором. Если я снова нажму C-s, он затем обернет поиск, указав "Обернутый I-поиск". Как поместить и переместить курсор по умолчанию, как в Vim, без повторения C-s?

4b9b3361

Ответ 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)))