对于那些不知道的人,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的作用方式是,它在闲置时就会出现问题。它一次保持状态和一点点状态,始终记住它停止的地方,还需要做什么其他事情,自上次祝福以来发生了什么变化等等。我的理解是否正确?也许我可以使用这种增量方法。
建议?
答案 0 :(得分:9)
要异步运行elisp,您可以使用run-with-idle-timer
或run-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/基本上包含了执行此操作所必需的样板文件。如果它被积极维护或者其他任何东西都没有任何线索。