我有一个Emacs命令如下:
(defun query-lisp (word)
(interactive "sType a word to query:")
(message "%s" (query word)))
query
操作是一项耗时的操作。当此命令运行时,Emacs会阻止整个帧。有没有办法让Emacs在后台运行此命令或只阻止一个窗口,如迷你缓冲区?
答案 0 :(得分:11)
如果您打算使用外部流程(已在另一个问题的评论中指明),您可以使用以下内容:
(start-process NAME BUFFER PROGRAM &rest PROGRAM-ARGS)
这将返回进程对象。您可以将输出发送到缓冲区,也可以将过滤器功能附加到进程。在后一种情况下,这是一个在每次进程发出任何输出时调用的函数。
此外,您可以将哨兵功能附加到您的流程中。每次进程状态发生变化时都会调用此函数,这有助于找出它何时退出。
在Emacs的源代码中有以上几个例子,其中一个例子是compile.el
。
答案 1 :(得分:9)
Emacs没有线程。对于长时间操作,您可以将任务拆分为块并在idle timers中执行块,以便emacs可以响应块之间的用户输入。
另一种可能性是将其作为外部进程运行,emacs接受输出。
答案 2 :(得分:4)
例如,你可以使用这样的东西
(shell-command "sleep 10 && echo 'finished' &")
结果将显示在*Async Shell Command*
缓冲区中。