Cuando parte de un defun
,
(interactive "c(C)hoose (A)n (O)ption")
le pedirá al usuario un solo carácter; RET
no es requerido. ¿Cómo puedo replicar este comportamiento de lectura sin la necesidad de hacerlo interactive
?
minibuffer
interactive
Sean Allred
fuente
fuente
read-char-choice
Además de las formas integradas para leer eventos individuales como
read-char
yread-char-exclusive
, aquí hay una opción para leer un solo carácter, pero también especificar qué caracteres son de entrada aceptable:Por lo tanto, todo lo siguiente aceptará "C", "A" u "O":
Y aquí hay una forma de ejemplo de bucle para la entrada correcta en una
response
variable:fuente
read-char-choice
uno que lee uno de un conjunto de caracteres dado.call-interactively
es lo que interpreta la(interactive "cPROMPT")
especificación, lac
opción se envía aread-char
. Por lo tanto, lo siguiente debería funcionar en un contexto no interactivo:fuente
La pregunta fue respondida hace mucho tiempo, pero esta respuesta adicional puede proporcionar alguna ayuda a otros buscadores.
read-char-choice
le permite especificar una lista de opciones. El fn no volverá hasta que el usuario seleccione una de esas opciones válidas.En el caso degenerado en el que las opciones son simplemente Y o N (no distingue entre mayúsculas y minúsculas), existe
y-or-n-p
.Ambos
read-char-choice
yy-or-n-p
son rígidos, e insisten en una respuesta válida. En el primer caso, debe ser una de las opciones que especifique (como A, B o C en mi ejemplo), y en el último caso, debe ser Y o N. Si el usuario presiona Intro o cualquier otra tecla,y-or-n-p
volverá a preguntar. Elread-char-choice
solo se sentará allí, en silencio. Ninguno de los dos proporciona una manera de devolver un valor predeterminado. Para obtener ese comportamiento, creo que debes construir tu propia interacción conread-char
oread-key
.En mi experiencia, el problema con
read-char
yread-key
solo es que, si bien muestran la solicitud en el minibúfer, el cursor permanece en el búfer de edición principal. Esto es desorientador para el usuario y también es diferente al comportamiento deread-string
.Para evitar ESO, puede dejar que la variable
cursor-in-echo-area
antes de llamarread-key
muestre el cursor en el minibúfer.fuente