Spec-Zone.ru › Elisp

Приостановка Emacs

В текстовых терминалах можно приостановить Emacs, то есть временно остановить Emacs и вернуть управление родительскому процессу, которым обычно является оболочка. Это позволяет позднее возобновить редактирование в том же процессе Emacs с теми же буферами, тем же кольцом вырезания, той же историей отмены и так далее. Чтобы возобновить работу Emacs, используйте соответствующую команду в родительской оболочке — скорее всего, fg.

Приостановка работает только на терминальном устройстве, с которого был запущен сеанс Emacs. Мы называем это устройство управляющим терминалом сеанса. Приостановка невозможна, если управляющий терминал является графическим терминалом. Приостановка обычно не имеет смысла в графических средах, поскольку можно просто переключиться на другое приложение, не выполняя никаких специальных действий в Emacs.

Некоторые операционные системы (не поддерживающие SIGTSTP, а также MS-DOS) не поддерживают приостановку заданий; в таких системах приостановка фактически временно запускает новую оболочку как дочерний процесс Emacs. Чтобы вернуться в Emacs, нужно выйти из оболочки.

Команда: suspend-emacs &optional string

Эта функция останавливает Emacs и возвращает управление родительскому процессу. Когда родительский процесс возобновит работу Emacs, suspend-emacs возвращает nil своему вызывающему коду на Lisp.

Эта функция работает только на управляющем терминале сеанса Emacs; чтобы освободить другие устройства tty, используйте suspend-tty (см. ниже). Если сеанс Emacs использует несколько терминалов, перед приостановкой Emacs необходимо удалить кадры на всех остальных терминалах, иначе эта функция выдаст ошибку. См. раздел Несколько терминалов.

Если string не равна nil, её символы передаются родительской оболочке Emacs для чтения в качестве терминального ввода. Однако это действие пропускается, если Emacs запущен не в интерактивном режиме на терминале, либо если для помещения символов во входной поток терминала требуются специальные привилегии или эта возможность не поддерживается на данной платформе.

Перед приостановкой suspend-emacs выполняет обычный хук suspend-hook. После возобновления работы Emacs пользователем suspend-emacs выполняет обычный хук suspend-resume-hook. См. раздел Хуки.

При следующей перерисовке после возобновления работы будет перерисован весь экран, если только переменная no-redraw-on-reenter не равна nil. См. раздел Обновление экрана.

Вот пример того, как можно использовать эти хуки:

(add-hook 'suspend-hook
          (lambda () (or (y-or-n-p "Really suspend?")
                         (error "Suspend canceled"))))
(add-hook 'suspend-resume-hook (lambda () (message "Resumed!")
                                 (sit-for 2)))

Вот что вы увидите при вычислении (suspend-emacs):

---------- Buffer: Minibuffer ----------
Really suspend? y
---------- Buffer: Minibuffer ----------
---------- Parent Shell ----------
bash$ fg
---------- Echo Area ----------
Resumed!

Обратите внимание, что в некоторых операционных системах для отправки string родительской оболочке Emacs могут потребоваться специальные привилегии; в таком случае отправка string оболочке для выполнения может завершиться без предупреждения. В других системах эта возможность не поддерживается, и Emacs выдаст ошибку при попытке её использовать. Кроме того, string может не отображаться на экране, даже если оболочка выполняет её. Поэтому мы не рекомендуем полагаться на эту возможность в переносимых программах на Lisp.

Переменная: suspend-hook

Эта переменная содержит обычный хук, который Emacs выполняет перед приостановкой.

Переменная: suspend-resume-hook

Эта переменная содержит обычный хук, который Emacs выполняет после возобновления работы по окончании приостановки.

Функция: suspend-tty &optional tty

Если tty указывает на используемое Emacs терминальное устройство, эта функция освобождает устройство и восстанавливает его прежнее состояние. Кадры, использовавшие это устройство, продолжают существовать, но не обновляются, и Emacs не считывает с них ввод. В качестве tty можно указать объект терминала, кадр (то есть терминал этого кадра) или nil (то есть терминал выбранного кадра). См. раздел Несколько терминалов.

Если tty уже приостановлен, эта функция ничего не делает.

Эта функция выполняет хук suspend-tty-functions, передавая объект терминала в качестве аргумента каждой функции.

Функция: resume-tty &optional tty

Эта функция возобновляет работу ранее приостановленного терминального устройства tty; для tty допустимы те же значения, что и для suspend-tty.

Эта функция повторно открывает терминальное устройство, заново инициализирует его и перерисовывает на нём выбранный кадр этого терминала. Затем она выполняет хук resume-tty-functions, передавая объект терминала в качестве аргумента каждой функции.

Если это же устройство уже используется другим терминалом Emacs, функция выдаёт ошибку. Если tty не приостановлен, эта функция ничего не делает.

Функция: controlling-tty-p &optional tty

Эта функция возвращает значение, отличное от nil, если tty является управляющим терминалом сеанса Emacs; в качестве tty можно указать объект терминала, кадр (то есть терминал этого кадра) или nil (то есть терминал выбранного кадра).

Команда: suspend-frame

Эта команда приостанавливает кадр. Для графических кадров она вызывает iconify-frame (см. раздел Видимость кадров); для кадров в текстовых терминалах она вызывает либо suspend-emacs, либо suspend-tty — в зависимости от того, отображается ли кадр на управляющем терминальном устройстве.

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/Suspending-Emacs.html

Spec-Zone.ru

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