Quando parte de um defun
,
(interactive "c(C)hoose (A)n (O)ption")
solicitará ao usuário um único caractere; RET
não é necessário. Como posso replicar esse comportamento de leitura sem a necessidade interactive
?
minibuffer
interactive
Sean Allred
fonte
fonte
read-char-choice
Além das maneiras internas de ler eventos únicos como
read-char
eread-char-exclusive
, aqui está uma opção para ler um único caractere, mas também especificar quais caracteres são aceitáveis de entrada:Portanto, todos os itens a seguir aceitarão "C", "A" ou "O":
E aqui está um exemplo de maneira de fazer o loop da entrada correta em uma
response
variável:fonte
read-char-choice
que lê um de um determinado conjunto de caracteres.call-interactively
é o que interpreta a(interactive "cPROMPT")
especificação, ac
opção é despachada pararead-char
. Portanto, o seguinte deve funcionar em um contexto não interativo:fonte
A pergunta foi respondida há muito tempo, mas essa resposta adicional pode ajudar alguns outros usuários.
read-char-choice
permite especificar uma lista de opções. O fn não retornará até que o usuário selecione uma dessas opções válidas.No caso degenerado em que as opções são simplesmente Y ou N (não diferencia maiúsculas de minúsculas), existe
y-or-n-p
.Ambos
read-char-choice
ey-or-n-p
são rígidas, e insistem em uma resposta válida. No primeiro caso, ele deve ser uma das opções especificadas (como A, B ou C no meu exemplo) e, no último caso, deve ser Y ou N. Se o usuário pressionar enter ou qualquer outra tecla, ay-or-n-p
solicitação será novamente. Oread-char-choice
vai apenas ficar lá, em silêncio. Nenhum dos dois fornece uma maneira de retornar apenas um padrão. Para obter esse comportamento, acho que você precisa criar sua própria interação comread-char
ouread-key
.Na minha experiência, o problema com
read-char
eread-key
sozinho é que, enquanto eles exibem o prompt no minibuffer, o cursor permanece no buffer de edição principal. Isso é desorientador para o usuário e também é diferente do comportamento deread-string
.Para evitar isso, você pode deixar a variável
cursor-in-echo-area
antes da chamadaread-key
exibir o cursor no minibuffer.fonte