Приостановка 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