更新isearch-update-post-hook中的迷你缓冲区

时间:2014-08-23 20:11:49

标签: emacs elisp minibuffer isearch

在我的搜索中找到一个更简单的解决方案{@ 3}}我找到了以下包

"1 of n" result for Emacs search

但显示的信息延迟了一次击键。怎么解决这个问题?我的猜测是,我应该调用一些函数来更新isearch-cound-message末尾的迷你缓冲区,或者将更新注入isearch-message-suffix,以便在迷你缓冲区中显示信息的isearch逻辑。

有人知道吗?

1 个答案:

答案 0 :(得分: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-string提供,在输入之前是您上次使用的消息。这就是为什么在重新输入之前你会看到错误的数字。这可以很容易地纠正。

可以通过重置名为isearch-message-suffix-add的挂钩中isearch-exit-mode的值来更正初始错误消息。

更新:

这段代码是最好的代码。我今天看了看。编辑字符串与isearch-string不同,但延迟了1个字符。为了获得正确的显示,需要键入C-s或C-r 2次,因为edit-string与isearch-string相同。 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-string,以便在每个时刻知道会发生什么。