gpt4 book ai didi

emacs - 如何使用带有读取字符串的迷你缓冲区退出 Hook

转载 作者:行者123 更新时间:2023-12-02 04:39:12 25 4
gpt4 key购买 nike

我无法让 minibuffer-exit-hookread-string 配合使用。据我所知,在完成 read-string 后我不应该再在迷你缓冲区中。但是,条件 (minibufferp) 说即使 read-string 完成,我仍然在迷你缓冲区中。 read-string 是用 C 语言编写的,所以我不能在那里添加钩子(Hook)(即,在 read-string 函数的尾端)。

文档 [minibuffer-exit-hook]:正常 Hook 在退出 minibuffer 之后运行。

[在仔细考虑之后,我很确定这是一个错误——所以我提交了一个错误报告:bug#16524。当我了解更多信息时,我将更新此线程。

(defun test ()
(interactive)
(read-string "Prompt: " "testing"))

(add-hook 'minibuffer-exit-hook (lambda ()
(cond
((minibufferp)
(message "Focus is still in the minibuffer: %s" (buffer-name)))
(t (message "Contragulations -- focus is now in: %s." (buffer-name))))))

最佳答案

文档字符串不准确;就这样。当在迷你缓冲区中输入文本完成时运行 Hook (不再可能)。运行时当前的缓冲区仍然是迷你缓冲区。 (这就是应该的方式,FWIW。)

请注意,Elisp 手册的说法略有不同(但同样,不是很准确):

 This is a normal hook that is run whenever the minibuffer is
entered.

(“每当”,意思是大约同时,不一定在之后。)

如果您想在代码中每次使用 read-string 后做一些事情,那么定义一个函数来执行以下操作:首先 (read-string...),然后接下来你想做什么。并使用该功能。

如果您还需要影响 read-string 的其他调用,除了您在代码中编写的调用之外,那么建议函数 read-string 在原始代码完成。

例如:

(defadvice read-string (after fooness activate)
(message "buffer: %S" (current-buffer)))

[注意:是的,您可以建议原语(用 C 语言编写的函数)。您过去甚至可以建议特殊形式,但他们倒退地取消了该功能。]

关于emacs - 如何使用带有读取字符串的迷你缓冲区退出 Hook ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21299074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com