(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-string によって提供されます。入力する前は、前回使用したものです。これが、再入力する前に間違った番号が表示される理由です。これは非常に簡単に修正できます。
最初の不正なメッセージはisearch-message-suffix-add
、 という名前のフックでの値をリセットすることで修正できますisearch-exit-mode
。
アップデート:
このコードは、書くことができる最高のものです。今日見てみました。編集文字列は と同じではありませんが、isearch-string
1 文字遅れています。正しく表示するには、Cs または Cr を 2 回入力する必要があります。これにより、edit-string が isearch-string と同じになります。Isearch は、外部環境で変数をエクスポートして、値を編集文字列にすることはしません。
(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-string を表示して、それぞれの瞬間に何を期待するかを知ることができます。