Обновите минибуфер в isearch-update-post-hook

В моем поиске, чтобы найти более простое решение, которое нашло результат "1 из n" для поиска в Emacs, я нашел следующий пакет

https://github.com/nordlow/elisp/blob/master/mine/indexed-isearch.el

Но отображаемая информация задерживается одним нажатием клавиши. Как это исправить? Я думаю, что я должен либо вызвать функцию, которая обновляет минибуфер в конце isearch-cound-message или добавьте обновление isearch-message-суффикс раньше, чем логика isearch, которая отображает информацию в минибуфере.

Кто-нибудь знает?

1 ответ

(defun isearch-count-message ()
  (when isearch-success
   (let* ((string isearch-string))
     (when (>= (length string) 1)
       (let ((before (count-matches string (point-min) (point)))
             (after (count-matches string (point) (point-max))))
         (setq isearch-message-suffix-add
               (propertize (format " (%d of %d)"
                                   before
                                   (+ before
                                      after))
                           'face 'shadow)))))))

(add-hook 'isearch-update-post-hook 'isearch-count-message)

Исходное сообщение предоставляется строкой isearch, которая перед вводом является той, которую вы использовали в прошлый раз. Вот почему перед повторным вводом вы видите неправильный номер. Это можно исправить довольно легко.

Исходное плохое сообщение может быть исправлено путем сброса значения isearch-message-suffix-add в крючке по имени isearch-exit-mode,

ОБНОВИТЬ:

Этот код - лучший, который можно написать. Я посмотрел на это сегодня. Строка редактирования не совпадает с isearch-string, но задерживается на 1 символ. Для правильного отображения нужно дважды набрать Cs или Cr, чтобы строка редактирования была такой же, как строка isearch. Isearch не экспортирует во внешнюю среду переменную, имеющую значение edit-string.

(defun isearch-display-count-matches ()
  (if isearch-just-started
      (setq isearch-message-suffix-add "")
      (let ((before (count-matches isearch-string (point-min) (point)))
            (after (count-matches isearch-string (point) (point-max))))
        (setq isearch-message-suffix-add
              (propertize (format " -%s- (%d of %d)" isearch-string
                                  before (+ before after))
                          'face 'isearch-face)))))

(add-hook 'isearch-update-post-hook 'isearch-display-count-matches 'end t)

И в isearch-mode-end-hook Я вставил так:

(setq isearch-message-suffix-add "")
(remove-hook 'isearch-update-post-hook 'isearch-display-count-matches t)

Это хорошо работает для меня - и отображает строку isearch, чтобы знать, чего ожидать в каждый момент.

Другие вопросы по тегам