Буферы процессов
Процесс может (и обычно имеет) сопутствующий буфер, который представляет собой обычный буфер Emacs, используемый для двух целей: хранения вывода процесса и определения момента завершения процесса. Вы также можете использовать буфер для идентификации процесса, над которым нужно выполнить операцию, поскольку в нормальной практике только один процесс ассоциируется с любым заданным буфером. Многие приложения, использующие процессы, также используют буфер для редактирования входных данных, которые будут отправлены процессу, но это не встроено в Emacs Lisp.
По умолчанию вывод процесса вставляется в сопутствующий буфер. (Вы можете изменить это, определив пользовательскую функцию фильтра, см. Функции фильтра.) Позиция вставки вывода определяется process-mark, которая затем обновляется, указывая на конец только что вставленного текста. Обычно, но не всегда, process-mark находится в конце буфера.
Завершение сопутствующего буфера процесса также завершает процесс. Emacs запрашивает подтверждение в первую очередь, если process-query-on-exit-flag процесса не nil (см. Запрос перед выходом). Это подтверждение выполняется функцией process-kill-buffer-query-function, которая запускается из kill-buffer-query-functions (см. Удаление буферов).
- Функция: process-buffer process
-
Эта функция возвращает сопутствующий буфер указанного процесса process.
(process-buffer (get-process "shell")) ⇒ #<buffer *shell*>
- Функция: process-mark process
-
Эта функция возвращает маркер процесса для process, который указывает, куда вставлять вывод процесса.
Если у process нет буфера,
process-markвозвращает маркер, который ни на что не указывает.Функция фильтра по умолчанию использует этот маркер для определения места вставки вывода процесса и обновляет его, указывая на позицию после вставленного текста. Именно поэтому последовательные партии вывода вставляются последовательно.
Пользовательские функции фильтра обычно должны использовать этот маркер таким же образом. Пример функции фильтра, использующей
process-mark, см. Пример фильтра процесса.Когда от пользователя ожидается ввод в буфер процесса для передачи процессу, маркер процесса отделяет новый ввод от предыдущего вывода.
- Функция: set-process-buffer process buffer
Эта функция устанавливает буфер, связанный с process, на buffer. Если buffer
nil, процесс не связывается ни с каким буфером; если неnil, маркер процесса будет установлен на конец buffer.
- Функция: get-buffer-process buffer-or-name
-
Эта функция возвращает не удаленный процесс, связанный с буфером, указанным buffer-or-name. Если с ним связаны несколько процессов, эта функция выбирает один (в настоящее время – самый последний, но не полагайтесь на это). Удаление процесса (см.
delete-process) делает его недоступным для возврата этой функцией.Обычно не рекомендуется иметь более одного процесса, связанного с одним и тем же буфером.
(get-buffer-process "*shell*") ⇒ #<process shell>Удаление буфера процесса удаляет процесс, что приводит к завершению дочернего процесса с сигналом
SIGHUP(см. Сигналы для процессов).
Если буфер процесса отображается в окне, вашей программе Lisp может потребоваться сообщить процессу размеры этого окна, чтобы процесс мог адаптировать свой вывод к этим размерам, так же как он адаптируется к размерам экрана. Следующие функции позволяют передавать эту информацию процессам; однако не все системы поддерживают основную функциональность, поэтому лучше всего предоставить варианты, например, через аргументы командной строки или переменные окружения.
- Функция: set-process-window-size process height width
Сообщите process, что его логический размер окна имеет размеры width на height в единицах символов. Если эта функция успешно передаст эту информацию процессу, она вернет
t; в противном случае она вернетnil.
Когда окна, отображающие буферы, связанные с процессом, изменяют свои размеры, соответствующие процессы должны быть проинформированы об этих изменениях. По умолчанию, при изменении конфигурации окна Emacs автоматически вызовет set-process-window-size от имени каждого процесса, чей буфер отображается в окне, передавая ему наименьшие размеры всех окон, отображающих буфер процесса. Это работает через window-configuration-change-hook (см. Вспомогательные функции окна), которому сказано вызывать функцию, которая является значением переменной window-adjust-process-window-size-function для каждого процесса, чей буфер отображается хотя бы в одном окне. Вы можете настроить это поведение, изменив значение этой переменной.
- Параметр пользователя: window-adjust-process-window-size-function
-
Значение этой переменной должно быть функцией с двумя аргументами: процессом и списком окон, отображающих буфер процесса. Когда функция вызывается, буфер процесса является текущим буфером. Функция должна вернуть пару
(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.
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Process-Buffers.html