21.7 Запросы "Да" или "Нет"

В этом разделе описываются функции, используемые для задавания пользователю вопроса "да" или "нет". Функция y-or-n-p может быть отвечена одним символом; она полезна для вопросов, где непреднамеренный неправильный ответ не повлечет за собой серьезных последствий. yes-or-no-p подходит для более важных вопросов, поскольку для ответа на них требуется три или четыре символа.

Если одна из этих функций вызывается в команде, которая была вызвана с помощью мыши или какого-либо другого жеста оконной системы, или в команде, вызванной через меню, то они используют диалоговое окно или выпадающее меню для задания вопроса, если диалоговые окна поддерживаются. В противном случае они используют ввод с клавиатуры. Вы можете принудительно использовать мышь или ввод с клавиатуры, привязав last-nonmenu-event к подходящему значению вокруг вызова — привяжите его к t, чтобы принудительно использовать ввод с клавиатуры, и к списку, чтобы принудительно использовать диалоговые окна.

И yes-or-no-p, и y-or-n-p используют минибуфер.

Функция: y-or-n-p prompt

Эта функция задает пользователю вопрос, ожидая ввод в минибуфере. Она возвращает t, если пользователь вводит y, и nil, если пользователь вводит n. Эта функция также принимает SPC как "да" и DEL как "нет". Она принимает C-] и C-g для выхода, потому что вопрос использует минибуфер, и по этой причине пользователь может попытаться использовать C-] для выхода. Ответ — один символ, для его завершения не требуется RET. Заглавные и строчные буквы эквивалентны.

"Задавание вопроса" означает вывод prompt в минибуфере, за которым следует строка '(y или n)'. Если ввод не является одним из ожидаемых ответов (y, n, SPC, DEL или чем-то, что вызывает выход), функция отвечает 'Пожалуйста, ответьте да или нет.' и повторяет запрос.

Если prompt — это непустая строка, и она заканчивается символом, не являющимся пробелом, к ней будет добавлен символ 'SPC'.

Эта функция фактически использует минибуфер, но не позволяет редактировать ответ. Курсор перемещается в минибуфер во время задавания вопроса.

Ответы и их значения, даже 'y' и 'n', не жестко заданы, а определяются картой клавиш query-replace-map (см. Поиск и замена). В частности, если пользователь вводит специальные ответы recenter, scroll-up, scroll-down, scroll-other-window или scroll-other-window-down (соответственно привязанные к C-l, C-v, M-v, C-M-v и C-M-S-v в query-replace-map), эта функция выполняет указанную операцию центрирования окна или прокрутки и снова задает вопрос.

Если вы привяжете help-form (см. Функции справки) к значению, отличному от nil, при вызове y-or-n-p, то нажатие help-char заставит ее вычислить help-form и отобразить результат. help-char автоматически добавляется к prompt.

Функция: y-or-n-p-with-timeout prompt seconds default

Подобно y-or-n-p, за исключением того, что если пользователь не отвечает в течение seconds секунд, эта функция прекращает ожидание и возвращает default. Она работает путем настройки таймера; см. Таймеры для отложенного выполнения. Аргумент seconds должен быть числом.

Функция: yes-or-no-p prompt

Эта функция задает пользователю вопрос, ожидая ввод в минибуфере. Она возвращает t, если пользователь вводит 'yes', nil, если пользователь вводит 'no'. Пользователь должен нажать RET, чтобы подтвердить ответ. Заглавные и строчные буквы эквивалентны.

yes-or-no-p начинается с отображения prompt в минибуфере, за которым следует значение yes-or-no-prompt (по умолчанию '(yes или no)'). Пользователь должен ввести один из ожидаемых ответов; в противном случае функция отвечает 'Пожалуйста, ответьте да или нет.', ждет около двух секунд и повторяет запрос.

Если prompt — это непустая строка, и она заканчивается символом, не являющимся пробелом, к ней будет добавлен символ 'SPC'.

yes-or-no-p требует от пользователя больше усилий, чем y-or-n-p, и подходит для более важных решений.

Вот пример:

(yes-or-no-p "Вы действительно хотите удалить все? ")

;; После вычисления предыдущего выражения,
;;   появляется следующий запрос,
;;   с пустым минибуфером:

---------- Буфер: minibuffer ----------
Вы действительно хотите удалить все? (yes или no)
---------- Буфер: minibuffer ----------

Если пользователь сначала вводит y RET, что недействительно, поскольку эта функция требует всего слова 'yes', она отвечает, отображая следующие запросы, с короткой паузой между ними:

---------- Буфер: minibuffer ----------
Пожалуйста, ответьте да или нет.
Вы действительно хотите удалить все? (yes или no)
---------- Буфер: minibuffer ----------