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

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

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

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

Команда: suspend-emacs &опциональная строка

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

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

Если string не является nil, ее символы отправляются в родительскую оболочку 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 "pwd"):

---------- Buffer: Minibuffer ----------
Really suspend? y
---------- Buffer: Minibuffer ----------

---------- Parent Shell ----------
bash$ pwd
/home/username
bash$ fg

---------- Echo Area ----------
Resumed!

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

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

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

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

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

Функция: suspend-tty &опционально tty

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

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

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

Функция: resume-tty &опционально tty

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

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

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

Функция: controlling-tty-p &опционально tty

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

Команда: suspend-frame

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