如何异步运行elisp函数?

如何异步运行elisp函数?

问题描述:

对于那些不知道的人来说,imenu是emacs中的一个东西,它允许一个模式在菜单栏中插入一个或多个菜单项。最常见的用法是从下拉菜单中访问“目录”,以便用户可以快速跳转到文档中的功能或类或部分的声明等。如何异步运行elisp函数?

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

我正在做后者 - imenu-create-index-function - 但有时fn需要一段时间才能运行,比如说3或4秒或更长时间,这会冻结用户界面。如果我使操作异步,那就可以解决这个问题。

我了解异步流程。扫描逻辑在elisp中实现。是否有可能在异步过程中运行elisp?如果是这样,怎么样?

或者,有没有办法在emacs中异步运行常规elisp,而不诉诸于异步进程?

我认为字体锁的方式,它闲置闲置。它一次保持状态和小小的形象,永远记住它停留的地方,还有什么需要被建立,自从上一次分身运行以来发生了什么变化,等等。我的理解是否正确?也许我可以使用这种渐进式方法。

建议?

要异步运行elisp,您可以使用run-with-idle-timerrun-with-timer。我想你会想要idle版本。查看文档链接了解更多详情。

注意:如果代码需要3或4秒才能运行,它仍然需要很长时间(并且在运行时冻结Emacs),所以如果可以将工作分解为足够小的块每次0.5秒左右,这可能会奏效。

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

您可以通过在批处理模式下产生emacs作为进程来运行elisp,参见http://www.emacswiki.org/emacs/BatchMode。除此之外,据我所知基本没有什么。

它看起来像http://nschum.de/src/emacs/async-eval/基本上包装了这样做所需的样板。没有线索,如果它被积极维护或什么的。