Spec-Zone.ru › Elisp

Вопросы с ответом «да» или «нет»

В этом разделе описаны функции, предназначенные для того, чтобы задать пользователю вопрос, на который можно ответить «да» или «нет». На функцию 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

Spec-Zone.ru

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