В этом разделе описываются средства для задания пользователю более сложных вопросов или нескольких однотипных вопросов.
Если вам нужно задать серию однотипных вопросов, например «Сохранить этот буфер?»
для каждого буфера по очереди, следует использовать map-y-or-n-p
для задания всего набора вопросов, а не задавать каждый вопрос по отдельности.
Это предоставляет пользователю удобные возможности, такие как ответ сразу на всю серию.
Эта функция задаёт пользователю серию вопросов, считывая односимвольный ответ в области эха для каждого из них.
Значение 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").
При каждом задании вопроса пользователь может ответить следующим образом:
выполнить действие над объектом
пропустить объект
выполнить действие над всеми следующими объектами
выйти (пропустить все следующие объекты)
выполнить действие над объектом и затем выйти
получить справку
Это те же ответы, которые принимает query-replace. Клавиатурная карта
query-replace-map определяет их значение для
map-y-or-n-p, а также для query-replace; см.
Поиск и замена.
Вы можете использовать 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.
Эта функция запрашивает у пользователя текст в question, который должен заканчиваться символом ‘SPC’. Функция включает в запрос возможные ответы из answers, добавляя их в конец question. Возможные ответы передаются в 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 "выполнить действие")
("no" ?n "перейти к следующему")
("all" ?! "выполнить для остальных без дополнительных вопросов")
("help" ?h "показать справку")
("quit" ?q "выйти"))))
Эта функция использует минибуфер для чтения и возврата одного символа.
При необходимости она игнорирует любой ввод, не входящий в
chars — список принимаемых символов. Аргумент history
задаёт символ списка истории для использования; если он опущен или
равен nil, эта функция не использует историю.
Если вы привяжете help-form (см. Функции справки) к
значению, не равному nil, при вызове read-char-from-minibuffer,
то нажатие help-char приведёт к вычислению help-form
и отображению результата.