Answers:
您可以使用来启动后台进程start-process
,该进程不应弹出缓冲区:
(start-process "process-name" "buffer-name" "program")
修改了进程名称以避免必要的重复,因此不必担心。只要给它起一个将来调试有用的名称即可!
如果提供"buffer-name"
,则会创建一个缓冲区,但不会立即显示。这对于管理流程和查看输出会很方便。如果根本不想创建缓冲区,请以nil
缓冲区名称传递:
(start-process "process-name" nil "program")
"program"
在这种情况下,只有程序名称(例如nautilus,caja,firefox),并且"arg1 arg2 ..."
应位于的第四个位置参数中start-process
。我通过阅读文档了解了这一点:)
就像提坤提到的那样,(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.
set-process-sentinel
准确描述一下吗?我有一个管理流程的功能的一般想法,但是我不完全理解所有细节。谢谢!
M-x describe-function
输入并输入,set-process-sentinel
您将从Emacs文档中得到简短答案:(set-process-sentinel PROCESS SENTINEL)给PROCESS哨兵SENTINEL;默认为零。当流程更改状态时,将哨兵称为函数。它有两个参数:过程和描述更改的字符串。
C-h f
... 即可了解更多信息
无需更改运行异步命令的方式。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))
start-process
用于sudo命令吗?我尝试将通话打入start-process
,(let ((default-directory "/sudo::")) ... )
但对我来说不起作用。