如何在不弹出缓冲区的情况下在后台运行异步进程?


23

我已经定义了一些async-shell-command在.emacs中运行异步后台进程的函数,但是每次我运行命令时,都会创建一个新窗口(不是框架),并且在那里显示进程的缓冲区。如何在没有“弹出”缓冲区的情况下运行命令?

Answers:


21

您可以使用来启动后台进程start-process,该进程不应弹出缓冲区:

(start-process "process-name" "buffer-name" "program")

修改了进程名称以避免必要的重复,因此不必担心。只要给它起一个将来调试有用的名称即可!

如果提供"buffer-name",则会创建一个缓冲区,但不会立即显示。这对于管理流程和查看输出会很方便。如果根本不想创建缓冲区,请以nil缓冲区名称传递:

(start-process "process-name" nil "program")

可以start-process用于sudo命令吗?我尝试将通话打入start-process(let ((default-directory "/sudo::")) ... )但对我来说不起作用。
sid-kap,2016年

@ sid-kap:我不知道。您可能应该将其作为一个独立的问题提出来。
迪洪·杰维斯

1
"program"在这种情况下,只有程序名称(例如nautilus,caja,firefox),并且"arg1 arg2 ..."应位于的第四个位置参数中start-process。我通过阅读文档了解了这一点:)
biocyberman

8

就像提坤提到的那样,(start-process)是要走的路。如果您不想创建缓冲区,但仍想对后台进程状态做出反应,则也可以使用(set-process-sentinel)。这是我从projector包装中取出的修改后的示例:

(set-process-sentinel (start-process "process-name" nil "command") #'output-message-sentinel)

(defun output-message-sentinel (process msg)
  (when (memq (process-status process) '(exit signal))
    (message (concat (process-name process) " - " msg))))

从Emacs函数描述:

(set-process-sentinel PROCESS SENTINEL)

Give PROCESS the sentinel SENTINEL; nil for default.
The sentinel is called as a function when the process changes state.
It gets two arguments: the process, and a string describing the change.

有关进程GNU手册页非常有用。


您能set-process-sentinel准确描述一下吗?我有一个管理流程的功能的一般想法,但是我不完全理解所有细节。谢谢!
Tikhon Jelvis

如果您M-x describe-function输入并输入,set-process-sentinel您将从Emacs文档中得到简短答案:(set-process-sentinel PROCESS SENTINEL)给PROCESS哨兵SENTINEL;默认为零。当流程更改状态时,将哨兵称为函数。它有两个参数:过程和描述更改的字符串。
waymondo 2014年

1
实际上,SentinelsProcesses GNU Emacs手册页对于获得更详细的信息非常有用。
waymondo 2014年

凉。也许您可以将链接编辑成答案?我想人们也可以只使用C-h f... 即可了解更多信息
Tikhon Jelvis 2014年

2

无需更改运行异步命令的方式。Emacs具有通用功能,可让您通过修改单个数据结构来控制在何处或是否弹出任何缓冲区display-buffer-alist

在下面的解决方案中,您可以看到将动作功能display-buffer-no-window(即,没有弹出窗口)设置为与任何以名称开头的缓冲区关联*Asynchronous Shell Command*(当要求创建多个缓冲区时,emacs会添加一个增量后缀)。

要查看其他可用显示选项的列表,请键入C-h f display-buffer并查找“动作功能”列表。

;; Buffers that I don't want popping up by default
(add-to-list 'display-buffer-alist
  '("\\*Async Shell Command\\*.*" display-buffer-no-window))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.