Spec-Zone.ru › Elisp

Задание вопросов с несколькими вариантами ответа

В этом разделе описаны средства для задания пользователю более сложных вопросов или нескольких похожих вопросов.

Если вам нужно задать ряд похожих вопросов, например «Хотите сохранить этот буфер?» для каждого буфера по очереди, используйте map-y-or-n-p, чтобы задать все вопросы, а не задавайте каждый вопрос по отдельности. Это предоставляет пользователю ряд удобных возможностей, например возможность ответить сразу на все вопросы.

Функция: map-y-or-n-p prompter actor list &optional help action-alist no-cursor-in-echo-area

Эта функция задает пользователю ряд вопросов, считывая в минибуфере ответ из одного символа на каждый вопрос. Однако если y-or-n-p-use-read-key не является nil (см. Ввод последовательности клавиш), она считывает последовательность клавиш из области эха.

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

Аргумент prompter задает способ формирования каждого вопроса. Если prompter — строка, текст вопроса вычисляется следующим образом:

(format prompter object)

где object — следующий объект, о котором нужно спросить (полученный из list). Дополнительные сведения о format см. в разделе Форматирование строк.

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

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

Если задан аргумент help, он должен быть списком следующего вида:

(singular plural action)

где singular — строка с существительным в единственном числе, обозначающим один объект, с которым нужно выполнить действие, plural — соответствующее существительное во множественном числе, а action — переходный глагол, описывающий, что actor делает с объектами.

Если не указать help, по умолчанию используется список ("object" "objects" "act on").

При каждом задании вопроса пользователь может ответить следующим образом:

y, Y или SPC

выполнить действие с объектом

n, N или DEL

пропустить объект

!

выполнить действие со всеми последующими объектами

ESC или q

выйти (пропустить все последующие объекты)

. (точка)

выполнить действие с объектом, а затем выйти

C-h

получить справку

Это те же ответы, которые принимает query-replace. Их значения для map-y-or-n-p и query-replace задаются раскладкой клавиатуры query-replace-map; см. раздел Поиск и замена.

С помощью action-alist можно указать дополнительные возможные ответы и их значения. Если задан, action-alist должен быть ассоциативным списком, элементы которого имеют вид (char function help). Каждый элемент ассоциативного списка задает один дополнительный ответ. В каждом элементе char — это символ (ответ), function — функция с одним аргументом (объектом из list), а help — строка. Когда пользователь вводит char, map-y-or-n-p вызывает function. Если функция возвращает значение, отличное от nil, считается, что действие с объектом выполнено, и map-y-or-n-p переходит к следующему объекту в list. Если она возвращает nil, запрос повторяется для того же объекта. Если пользователь запрашивает справку, для описания этих дополнительных ответов используется текст из help.

Обычно при выводе запроса map-y-or-n-p связывает cursor-in-echo-area. Но если no-cursor-in-echo-area не является nil, этого не происходит.

Если map-y-or-n-p вызывается в команде, запущенной с помощью мыши или другого действия в оконной системе, либо в команде, запущенной через меню, то при поддержке диалоговых окон для задания вопроса используется диалоговое окно или всплывающее меню. В этом случае клавиатурный ввод и область эха не используются. Можно принудительно использовать мышь или клавиатурный ввод, связав last-nonmenu-event с подходящим значением на время вызова: свяжите её с t, чтобы принудительно включить взаимодействие с клавиатурой, или со списком, чтобы принудительно использовать диалоговые окна.

Возвращаемое значение map-y-or-n-p — количество объектов, с которыми выполнено действие.

Если нужно задать пользователю вопрос, на который можно дать более двух ответов, используйте read-answer.

Функция: read-answer question answers

Эта функция выводит пользователю запрос с текстом из question, который должен заканчиваться символом «SPC». Функция добавляет в конец question возможные ответы из answers. Возможные ответы задаются в answers в виде ассоциативного списка, элементы которого имеют следующий вид:

(long-answer short-answer help-message)

где long-answer — полный текст ответа пользователя в виде строки, short-answer — краткая форма того же ответа, состоящая из одного символа или функциональной клавиши, а help-message — текст с описанием значения ответа. Если read-answer-short не является nil, в запросе отображаются краткие варианты возможных ответов, и пользователь должен вводить показанные в запросе отдельные символы или клавиши; в противном случае в запросе отображаются полные варианты ответов, и пользователь должен ввести полный текст одного из ответов и нажать RET. Если use-dialog-box не является nil и функция вызвана в ответ на события мыши, вопрос и ответы отображаются в графическом диалоговом окне.

Функция возвращает текст выбранного пользователем long-answer, независимо от того, отображались ли в запросе полные или краткие ответы и какой вариант ввел пользователь.

Вот пример использования этой функции:

(let ((read-answer-short t))
  (read-answer "Foo "
     '(("yes"  ?y "perform the action")
       ("no"   ?n "skip to the next")
       ("all"  ?! "perform for the rest without more questions")
       ("help" ?h "show help")
       ("quit" ?q "exit"))))
Функция: read-char-from-minibuffer prompt &optional chars history

Эта функция использует минибуфер для считывания и возврата одного символа. При необходимости она игнорирует любой ввод, не входящий в chars — список допустимых символов. Аргумент history задает символ списка истории, который нужно использовать; если он опущен или равен nil, эта функция не использует историю.

Если во время вызова read-char-from-minibuffer связать help-form (см. раздел Функции справки) со значением, отличным от nil, нажатие help-char заставит функцию вычислить help-form и отобразить результат.

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/Multiple-Queries.html

Spec-Zone.ru

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