Процесс может (и обычно имеет) связанный буфер — это обычный буфер Emacs, который используется для двух целей: хранения вывода от процесса и определения момента завершения процесса. Вы также можете использовать буфер для идентификации процесса, с которым работаете, поскольку в обычной практике с любым заданным буфером связан только один процесс. Многие приложения, использующие процессы, также применяют буфер для редактирования ввода, отправляемого процессу, но это не встроено в Emacs Lisp.
По умолчанию вывод процесса вставляется в связанный буфер. (Вы можете изменить это, определив собственную функцию фильтрации, см. Функции фильтрации процессов.) Позиция вставки вывода определяется process-mark, который затем обновляется так, чтобы указывать на конец только что вставленного текста. Обычно, но не всегда, process-mark находится в конце буфера.
Убийство связанного буфера процесса также убивает процесс. Emacs сначала запрашивает подтверждение, если флаг process-query-on-exit-flag процесса не равен nil (см. Запрос перед завершением). Это подтверждение выполняется функцией process-kill-buffer-query-function, которая запускается из kill-buffer-query-functions (см. Убийство буферов).
Эта функция возвращает связанный буфер указанного process.
(process-buffer (get-process "shell"))
⇒ #<buffer *shell*>
Эта функция возвращает маркер процесса для process, который указывает, куда вставлять вывод от процесса.
Если process не имеет буфера, process-mark возвращает маркер, указывающий в никуда.
Функция фильтрации по умолчанию использует этот маркер, чтобы определить, куда вставлять вывод процесса, и обновляет его так, чтобы он указывал после вставленного текста. Именно поэтому последовательные порции вывода вставляются подряд.
Пользовательские функции фильтрации обычно должны использовать этот маркер аналогичным образом. Пример функции фильтрации, использующей process-mark, см. в Пример фильтрации процесса.
Когда ожидается, что пользователь будет вводить данные в буфер процесса для передачи процессу, маркер процесса отделяет новый ввод от предыдущего вывода.
Эта функция устанавливает буфер, связанный с process, в buffer. Если buffer равен nil, процесс становится не связанным ни с каким буфером; если не равен nil и отличается от буфера, связанного с процессом, маркер процесса будет установлен в конец buffer (если только маркер процесса уже не связан с buffer).
Эта функция возвращает неудалённый процесс, связанный с буфером, указанным buffer-or-name. Если с ним связано несколько процессов, эта функция выбирает один (в текущей реализации — самый последний созданный, но не полагайтесь на это). Удаление процесса (см. delete-process) делает его непригодным для возврата этой функцией.
Обычно иметь более одного процесса, связанного с одним буфером, — плохая идея.
(get-buffer-process "*shell*")
⇒ #<process shell>
Убийство буфера процесса удаляет процесс, который завершает подпроцесс сигналом SIGHUP (см. Отправка сигналов процессам).
Если буфер процесса отображается в окне, ваша программа на Lisp может захотеть сообщить процессу размеры этого окна, чтобы процесс мог адаптировать свой вывод к этим размерам, подобно тому, как он адаптируется к размерам экрана. Следующие функции позволяют передавать такую информацию процессам; однако не все системы поддерживают соответствующую функциональность, поэтому лучше предусмотреть запасные варианты, например, через аргументы командной строки или переменные окружения.
Сообщает process, что его логический размер окна составляет width на height в символьных единицах. Если этой функции удаётся передать эту информацию процессу, она возвращает t; в противном случае возвращает nil.
Когда окна, отображающие буферы, связанные с процессом, изменяют свои размеры, затронутые процессы должны быть уведомлены об этих изменениях. По умолчанию при изменении конфигурации окон Emacs автоматически вызывает set-process-window-size для каждого процесса, чей буфер отображается в окне, передавая наименьшие размеры из всех окон, отображающих буфер процесса. Это работает через window-configuration-change-hook (см. Хуки для прокрутки окон и их изменений), которому предписывается вызывать функцию, являющуюся значением переменной 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 (см. Информация о процессе), его значение переопределяет глобальные и локальные для буфера значения window-adjust-process-window-size-function.