Spec-Zone.ru › Elisp

Буферы процессов

У процесса может быть (и обычно есть) связанный буфер — обычный буфер Emacs, который используется для двух целей: хранения вывода процесса и определения того, когда следует завершить процесс. Буфер также можно использовать для идентификации процесса, с которым нужно работать, поскольку обычно с каждым буфером связан только один процесс. Во многих приложениях процессы также используют буфер для редактирования ввода, который будет передан процессу, однако эта возможность не встроена в Emacs Lisp.

По умолчанию вывод процесса вставляется в связанный буфер. (Это можно изменить, определив пользовательскую функцию-фильтр; см. Функции-фильтры процессов.) Позиция для вставки вывода определяется с помощью process-mark, которое затем обновляется и указывает на конец только что вставленного текста. Обычно, но не всегда, process-mark находится в конце буфера.

При уничтожении связанного с процессом буфера уничтожается и процесс. Если значение process-query-on-exit-flag процесса не равно nil, Emacs сначала запрашивает подтверждение (см. Запрос подтверждения перед выходом). Подтверждение запрашивается функцией 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

Эта функция устанавливает буфер buffer в качестве связанного с process. Если buffer равен nil, процесс перестаёт быть связанным с каким-либо буфером; если он не равен nil и отличается от буфера, связанного с процессом, маркер процесса устанавливается в конец buffer (если маркер процесса ещё не связан с 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-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Process-Buffers.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API