运行 每次输入迷你缓冲区后的命令

Run a command after every input to minibuffer

我想在 Emacs 中设置一种 ISearch 模式替换,我可以在每次输入到迷你缓冲区后 运行 命令。可能吗?

编辑 1:

想法是完全用自己的模式代替ISearch。理想情况下,我希望它具有 ISearch 所具有的大部分功能(比如在您键入时突出显示结果)。要实现某些功能,我需要在输入每个键后 运行 命令。有没有办法在迷你缓冲区发生变化时触发函数,或者我应该使用不是迷你缓冲区的东西?

编辑 2:

更具体地说,基本上我希望从迷你缓冲区中取出一个字符串并突出显示缓冲区中的所有匹配项,就像在 ISearch 模式中一样。所以本质上,在每个字母、符号或数字输入到迷你缓冲区后,我希望能够识别该更改和 运行 一些任意的 elisp。类似于 helm 识别输入和更新搜索结果的方式。

参见变量 minibuffer-exit-hook

一般来说,这类题找一个名字以hook(或functionfunctions)结尾的变量。使用 apropos 等命令查找名称包含各种子字符串的变量(或函数)(例如 -hookminibuf)。

但是,您的问题有点不清楚。您真的会使用 Isearch 吗,或者您打算用使用迷你缓冲区的东西替换 Isearch 吗? 请更准确地说明您在做什么。

仅供参考 - Isearch 使用迷你缓冲区(除非您使用 M-e 编辑搜索字符串)。


编辑 1 后更新:

现在恐怕你的问题太宽泛,并且有可能因此而被关闭。您本质上是在含糊地询问如何实现 Isearch 的某种替代品。

如果您想在每个命令后执行某些操作,请参阅 post-command-hook。但请注意,几乎每次按键都是一次命令调用。


编辑 2 后更新:

在这种情况下,请考虑看看其他图书馆在这方面做了什么。例如,highlight.el (e.g. hlt-highlight-symbol), highlight-symbol.el, color-moccur.el, Icicles (e.g. icicle-occur)和 Helm(例如 helm-swoop)。其中一些,例如 Icicles 和 Helm,会按照您的描述提供增量突出显示更新。其他人突出显示在迷你缓冲区中 输入 的给定名称(即,使用 RET,而不仅仅是在迷你缓冲区中键入的字符)。

但是您可能想要指定您想要的与此类库已经做的不同的内容。对我来说,你的问题似乎仍然过于宽泛。

一般来说,诸如 Isearch 之类的增量更新 读取按键并做出相应响应。他们可能会迷你缓冲区或在顶层执行此操作,但关键是他们通常不需要用户在迷你缓冲区中输入某些内容, 使用 RET。它们在每次按键(或每次命令调用,例如通过 post-command-hook)后响应。

您想使用 minibuffer-with-setup-hook 并且在设置挂钩中,您需要使用 post-command-hookafter-change-functions

例如

(defun my-update-function (beg end len)
  (let ((str (minibuffer-contents)))
    <update-search-result>))

..(minibuffer-with-setup-hook
      (lambda ()
        (add-hook 'after-change-functions #'my-update-function))
    ...(read-string ...) ...)