如何异步运行elisp函数?

时间:2011-05-20 14:23:38

标签: emacs asynchronous

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

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

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

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

或者,有没有办法在emacs中异步运行常规的elisp,而不需要使用异步进程?

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

建议?

3 个答案:

答案 0 :(得分:9)

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

注意:如果代码需要3或4秒才能运行,它仍然会花费那么长时间(并在运行时冻结你的Emacs),所以如果你可以将工作分解成足够小的块,它只需要。一次5秒左右,这可能会很好。

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

答案 1 :(得分:2)

TreyJackson和jeremiahd发布的答案早在2011年就有效。现在,在2018年,这里是asynchronous processes的emacs文档的链接。

答案 2 :(得分:1)

您可以通过以批处理模式生成emacs作为流程在异步流程中运行elisp,请参阅http://www.emacswiki.org/emacs/BatchMode。除此之外,据我所知,基本上没什么。

看起来http://nschum.de/src/emacs/async-eval/基本上包含了执行此操作所必需的样板文件。如果它被积极维护或者其他任何东西都没有任何线索。