Emacs能否在后台运行命令

8

我有一个Emacs命令如下:

(defun query-lisp (word)
  (interactive "sType a word to query:")
  (message "%s" (query word)))

query 操作是一项耗时的操作。当此命令运行时,Emacs 会阻塞整个框架。是否有方法可以让 Emacs 在后台运行此命令或者只阻塞单个窗口(例如迷你缓冲区)?

3个回答

11
如果您计划使用外部进程(这是您在对另一个问题的评论中提到的),则可以使用以下方法:
 (start-process NAME BUFFER PROGRAM &rest PROGRAM-ARGS)
这将返回一个"process"对象。你可以将输出发送到缓冲区,或者你可以将一个“过滤函数”附加到进程上。在后一种情况下,这是一个每当进程发出任何输出时都会被调用的函数。
另外,你可以将一个“哨兵函数”附加到进程上。每当进程状态改变时,就会调用此函数,这对于找出何时退出非常有用。
在Emacs的源代码中有几个以上的示例,其中之一是"compile.el"。

9

Emacs没有线程。对于长时间的操作,你可以将任务分成几个部分,并在空闲时间使用空闲定时器来执行这些部分,这样Emacs可以在各个部分之间响应用户输入。

另一种可能性是将其作为外部进程运行,从中Emacs接受输出。


2
+1 为这个信息。实际上,我编写的查询函数是用 Python 写的,并通过 Pymacs 加载到 Emacs 中,所以我认为外部进程可能是一个解决方案。你能详细说明一下外部进程如何与 Emacs 进行交互吗? - DouO
1
emacs lisp 手册的相关部分 详细地解释了一切,并提供了示例。 - Tom
但是,如果您只想执行外部命令并显示其输出,则可以使用内置命令 - Tom

4
例如,你可以使用类似以下的内容:
(shell-command "sleep 10 && echo 'finished' &")

结果将显示在*异步Shell命令*缓冲区中。

shell-commandasync-shell-command(后者相当于(shell-command "... &"))的好处在于它们可以交互式调用,并分别绑定到M-!M-& - GDP2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接