Функции фильтрации процесса
Функция фильтра процесса — это функция, которая получает стандартный вывод от связанного процесса. Весь вывод этого процесса передается фильтру. По умолчанию фильтр просто выводит данные непосредственно в буфер процесса.
По умолчанию вывод ошибок процесса, если таковой имеется, также передается функции фильтра, если только место назначения стандартного потока ошибок процесса не было отделено от стандартного вывода при создании процесса. Emacs будет вызывать функцию фильтра только во время определенных вызовов функций. См. Вывод из процессов. Обратите внимание, что если функции вызываются фильтром, фильтр может вызываться рекурсивно.
Функция фильтра должна принимать два аргумента: связанный процесс и строку, которая была только что получена от него. Затем функция может делать с выводом все, что захочет.
Обычно выход из функции фильтра запрещен — в противном случае эффект ввода C-g на уровне команд или для выхода из пользовательской команды был бы непредсказуемым. Если вы хотите разрешить выход из функции фильтра, свяжите inhibit-quit с nil. В большинстве случаев правильный способ сделать это — использовать макрос with-local-quit. См. Выход.
Если во время выполнения функции фильтра произойдет ошибка, она автоматически перехватывается, чтобы не остановить выполнение программы, которая выполнялась при запуске функции фильтра. Однако, если debug-on-error не равно nil, ошибки не перехватываются. Это позволяет использовать отладчик Lisp для отладки функций фильтра. См. Отладчик.
Многие функции фильтра иногда (или всегда) вставляют вывод в буфер процесса, имитируя действия фильтра по умолчанию. Такие функции фильтра должны убедиться, что они сохраняют текущий буфер, выбирают правильный буфер (если он отличается) перед вставкой вывода, а затем восстанавливают исходный буфер. Они также должны проверить, жив ли буфер, обновить маркер процесса и в некоторых случаях обновить значение точки. Вот как это сделать:
(defun ordinary-insertion-filter (proc string)
(when (buffer-live-p (process-buffer proc))
(with-current-buffer (process-buffer proc)
(let ((moving (= (point) (process-mark proc))))
(save-excursion
;; Insert the text, advancing the process marker.
(goto-char (process-mark proc))
(insert string)
(set-marker (process-mark proc) (point)))
(if moving (goto-char (process-mark proc)))))))
Чтобы заставить фильтр отображать буфер процесса всякий раз, когда поступает новый текст, вы можете вставить строку, подобную следующей, непосредственно перед with-current-buffer конструкцией:
(display-buffer (process-buffer proc))
Чтобы заставить точку переместиться в конец нового вывода, независимо от ее предыдущего положения, удалите переменную moving из примера и вызовите goto-char безусловно. Обратите внимание, что это не обязательно перемещает точку окна. Фильтр по умолчанию фактически использует insert-before-markers, который перемещает все маркеры, включая точку окна. Это может перемещать не связанные маркеры, поэтому обычно лучше явно перемещать точку окна или установить ее тип вставки в t (см. Точка окна).
Обратите внимание, что Emacs автоматически сохраняет и восстанавливает данные сопоставления во время выполнения функций фильтра. См. Данные сопоставления.
Вывод в фильтр может поступать частями любого размера. Программа, которая дважды выводит одинаковый вывод подряд, может отправить его как одну партию из 200 символов один раз и пятью партиями по 40 символов в следующий раз. Если фильтр ищет определенные текстовые строки в выводе дочернего процесса, убедитесь, что вы обрабатываете случай, когда одна из этих строк разделена на две или более партии вывода; один из способов сделать это — вставить полученный текст во временный буфер, который затем можно искать.
- Функция: set-process-filter process filter
Эта функция дает process функцию фильтра filter. Если filter равно
nil, она дает процессу фильтр по умолчанию, который вставляет вывод процесса в буфер процесса. Если filter равноt, Emacs прекращает прием вывода от процесса, если это не серверный процесс сети, который ожидает входящих подключений.
- Функция: process-filter process
Эта функция возвращает функцию фильтра для process.
В случае, если вывод процесса необходимо передать нескольким фильтрам, вы можете использовать add-function для объединения существующего фильтра с новым. См. Функции консультирования.
Вот пример использования функции фильтра:
(defun keep-output (process output)
(setq kept (cons output kept)))
⇒ keep-output
(setq kept nil)
⇒ nil
(set-process-filter (get-process "shell") 'keep-output)
⇒ keep-output
(process-send-string "shell" "ls ~/other\n")
⇒ nil
kept
⇒ ("lewis@slug:$ "
"FINAL-W87-SHORT.MSS backup.otl kolstad.mss~ address.txt backup.psf kolstad.psf backup.bib~ david.mss resume-Dec-86.mss~ backup.err david.psf resume-Dec.psf backup.mss dland syllabus.mss " "#backups.mss# backup.mss~ kolstad.mss ")
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/Filter-Functions.html