41.9.1 进程缓冲区

一个进程可以(通常也会)拥有一个 关联缓冲区(associated buffer),它是一个普通的 Emacs 缓冲区,用于两个目的:存储来自进程的输出,以及决定何时终止该进程。你也可以通过该缓冲区标识要操作的进程,因为在常规使用中,一个给定缓冲区通常只关联一个进程。很多进程相关应用还会使用该缓冲区编辑要发送给进程的输入,但这并非 Emacs Lisp 内置功能。

默认情况下,进程输出会插入到关联缓冲区中。(你可以通过定义自定义过滤器函数改变这一行为,see 进程过滤器函数。)插入输出的位置由 进程标记 决定,之后该标记会更新为刚插入文本的末尾。通常(但并非总是)进程标记 位于缓冲区末尾。

终止进程的关联缓冲区也会终止该进程。如果进程的 process-query-on-exit-flag 为非 nil(see 退出前询问确认),Emacs 会先请求确认。该确认由函数 process-kill-buffer-query-function 完成,它会在 kill-buffer-query-functions 中运行(see 杀死缓冲区)。

Function: process-buffer process

该函数返回指定 process 的关联缓冲区。

(process-buffer (get-process "shell"))
     ⇒ #<buffer *shell*>
Function: process-mark process

该函数返回 process 的进程标记,该标记用于指定插入进程输出的位置。

如果 process 没有关联缓冲区,process-mark 会返回一个无指向的标记。

默认过滤器函数使用该标记决定插入进程输出的位置,并将其更新到插入文本之后。这也是连续多批输出会依次插入的原因。

自定义过滤器函数通常应按同样方式使用该标记。有关使用 process-mark 的过滤器函数示例,参见 see Process Filter Example

当期望用户在进程缓冲区中输入内容并发送给进程时,进程标记会将新输入与之前的输出分隔开。

Function: set-process-buffer process buffer

该函数将 process 的关联缓冲区设置为 buffer。如果 buffernil,进程将不再关联任何缓冲区;如果为非 nil 且与进程当前关联缓冲区不同,进程标记会被设置为指向 buffer 的末尾(除非进程标记已关联该缓冲区)。

Function: get-buffer-process buffer-or-name

该函数返回与 buffer-or-name 指定缓冲区关联的未删除进程。如果有多个进程关联该缓冲区,函数会选择其中一个(当前为最近创建的进程,但不要依赖这一行为)。删除进程(参见 delete-process)后,该函数将不再返回它。

通常不建议让多个进程关联同一个缓冲区。

(get-buffer-process "*shell*")
     ⇒ #<process shell>

终止进程的缓冲区会删除该进程,并通过 SIGHUP 信号终止子进程(see 向进程发送信号)。

如果进程的缓冲区显示在某个窗口中,你的 Lisp 程序可能需要告知进程该窗口的尺寸,以便进程像适配屏幕尺寸一样调整输出。下列函数可向进程传递这类信息,但并非所有系统都支持底层功能,因此最好提供备用方案,例如通过命令行参数或环境变量。

Function: set-process-window-size process height width

告知 process 其逻辑窗口尺寸为 width 字符宽、height 字符高。如果该函数成功将信息传递给进程,返回 t,否则返回 nil

当显示进程关联缓冲区的窗口尺寸改变时,应告知受影响的进程这一变化。默认情况下,窗口配置改变时,Emacs 会自动为所有缓冲区显示在窗口中的进程调用 set-process-window-size,并传入显示该进程缓冲区的所有窗口的最小尺寸。该功能通过 window-configuration-change-hook 实现(see 窗口滚动与变更的钩子函数),该钩子会为每个缓冲区显示在至少一个窗口中的进程,调用变量 window-adjust-process-window-size-function 对应的函数。你可以通过设置该变量自定义这一行为。

User Option: window-adjust-process-window-size-function

该变量的值应为一个接收两个参数的函数:一个进程,以及显示该进程缓冲区的窗口列表。函数被调用时,进程的缓冲区为当前缓冲区。函数应返回一个 cons 单元格 (width . height),描述通过 set-process-window-size 传递给进程的逻辑窗口尺寸。该函数也可返回 nil,此时 Emacs 不会为该进程调用 set-process-window-size

Emacs 为该变量提供两个预定义值:window-adjust-process-window-size-smallest,返回显示进程缓冲区的所有窗口尺寸中的最小值;以及 window-adjust-process-window-size-largest,返回最大值。如需更复杂的策略,可自行编写函数。

该变量可以是缓冲区局部的。

如果进程拥有 adjust-window-size-function 属性(see 进程信息),其值会覆盖 window-adjust-process-window-size-function 的全局值和缓冲区局部值。