Обновите минибуфер в 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, чтобы знать, чего ожидать в каждый момент.