Вопросы с ответом «да» или «нет»
В этом разделе описаны функции, предназначенные для того, чтобы задать пользователю вопрос, на который можно ответить «да» или «нет». На функцию 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 или команда выхода), функция выводит сообщение «Пожалуйста, ответьте y или n.» и повторяет запрос.
Если 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), эта функция выполняет указанную операцию перемещения или прокрутки окна и снова задаёт вопрос.Если во время вызова
y-or-n-pпривязатьhelp-form(см. Функции справки) к значению, отличному отnil, то нажатиеhelp-charприведёт к вычислениюhelp-formи отображению результата. К prompt автоматически добавляетсяhelp-char.
- Функция: 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) »). Пользователь должен ввести один из ожидаемых ответов; в противном случае функция выводит сообщение «Пожалуйста, ответьте yes или no.», ждёт около двух секунд и повторяет запрос.Если prompt — непустая строка, заканчивающаяся не пробелом, к ней будет добавлен символ «SPC».
yes-or-no-pтребует от пользователя больше действий, чемy-or-n-p, и подходит для более важных решений.Пример:
(yes-or-no-p "Do you really want to remove everything? ") ;; After evaluation of the preceding expression, ;; the following prompt appears, ;; with an empty minibuffer:
---------- Buffer: minibuffer ---------- Do you really want to remove everything? (yes or no) ---------- Buffer: minibuffer ----------
Если пользователь сначала вводит y RET, что недопустимо, поскольку эта функция требует ввести слово «yes» целиком, она выводит следующие подсказки, делая между ними короткую паузу:
---------- Buffer: minibuffer ---------- Please answer yes or no. Do you really want to remove everything? (yes or no) ---------- Buffer: minibuffer ----------
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/Yes_002dor_002dNo-Queries.html