Когда часть defun
,
(interactive "c(C)hoose (A)n (O)ption")
предложит пользователю ввести один символ; RET
не требуется. Как я могу повторить это поведение при чтении без необходимости interactive
?
minibuffer
interactive
Шон Оллред
источник
источник
read-char-choice
В дополнение к встроенным способам чтения отдельных событий, таким как
read-char
иread-char-exclusive
, здесь есть возможность прочитать один символ, но также указать, какие символы являются допустимыми для ввода:Таким образом, все последующие будут принимать «C», «A» или «O»:
И вот пример способа зацикливания для правильного ввода в
response
переменную:источник
read-char-choice
который читает один из заданного набора символов.call-interactively
это то, что интерпретирует(interactive "cPROMPT")
спецификацию,c
которой отправляется опцияread-char
. Следовательно, следующее должно работать в неинтерактивном контексте:источник
На вопрос был дан ответ давно, но этот дополнительный ответ может оказать некоторую помощь другим искателям.
read-char-choice
позволяет указать список вариантов. Fn не вернется, пока пользователь не выберет одну из этих допустимых опций.В вырожденном случае, когда варианты просто Y или N (без учета регистра), есть
y-or-n-p
.Оба
read-char-choice
иy-or-n-p
жестки, и настаивают на правильном ответе. В первом случае это должна быть одна из указанных вами опций (например, A, B или C в моем примере), а во втором - это Y или N. Если пользователь нажимает клавишу ввода или любую другую клавишу,y-or-n-p
запрос будет повторен.read-char-choice
Будет просто сидеть, молчать. Ни один из них не предоставляет способ просто вернуть значение по умолчанию. Чтобы получить такое поведение, я думаю, вы должны создать свое собственное взаимодействие сread-char
илиread-key
.По моему опыту, проблема с
read-char
и вread-key
одиночку заключается в том, что, хотя они отображают подсказку в минибуфере, курсор остается в основном буфере редактирования. Это дезориентирует пользователя, а также отличается от поведенияread-string
.Чтобы избежать ТО, вы можете позволить переменной
cursor-in-echo-area
до вызоваread-key
отображать курсор в минибуфере.источник