如何异步运行elisp函数?

Che*_*eso 12 emacs asynchronous

对于那些不知道的人来说,imenu是emacs中的一个东西,它允许模式将一个或多个菜单项插入菜单栏.最常见的用法是从下拉菜单中访问"目录",因此用户可以快速跳转到文档中的函数或类或节的声明等.

imenu有几种不同的工作方式 - 在第一种和更常用的方式中,主模式为imenu提供regexp,而imenu使用这些regexp来执行缓冲区的扫描并构​​建索引.主要模式通过将正则表达式列表放入其中来设置它imenu-generic-expression.第二种方式是主模式执行自己的扫描.它可以通过将变量设置imenu-create-index-function为由themode定义的函数的名称来执行此操作,该函数返回包含目录的列表.

我正在做后者 - imenu-create-index-function但有时fn需要花费很长时间才能运行,比如3或4秒或更长时间,这会冻结UI.如果我使操作异步,那将解决该问题.

我知道异步过程.扫描逻辑在elisp中实现.是否可以在异步流程中运行elisp?如果是这样,怎么样?

或者,有没有办法在emacs中异步运行常规的elisp,而不需要求助于异步流程?

我认为font-lock的作用方式是,它在闲置时就会出现问题.它一次保持状态和一点点状态,总是记住它停止的地方,还有什么需要被证实,自上次祝福以来发生了什么变化等等.我的理解是否正确?也许我可以使用这种增量方法.

建议?

Tre*_*son 9

要以异步方式运行elisp,您可以使用run-with-idle-timerrun-with-timer.我想你会想要这个idle版本.有关详细信息,请查看文档链接.

注意:如果代码需要3或4秒才能运行,它仍然会花费那么长时间(并在运行时冻结你的Emacs),所以如果你可以把工作分成足够小的块,只需要0.5秒或者所以,在某个时间,这可能会很好.

我一直使用的一个软件包,pabbrev.el非常好地使用空闲计时器 - 我从未注意到它正在运行.这可能是一个很好的包,可以检查它是如何分解工作的(它扫描所有打开的缓冲区并构建一个单词频率列表).

  • 现在,在 2018 年,emacs 记录了以下内容:http://www.gnu.org/software/emacs/manual/html_node/elisp/Asynchronous-Processes.html#Asynchronous-Processes (2认同)