Wenn ein Teil von defun
,
(interactive "c(C)hoose (A)n (O)ption")
fordert den Benutzer zur Eingabe eines einzelnen Zeichens auf; RET
ist nicht nötig. Wie kann ich dieses Leseverhalten replizieren, ohne dass dies erforderlich ist interactive
?
minibuffer
interactive
Sean Allred
quelle
quelle
read-char-choice
Zusätzlich zu den integrierten Möglichkeiten zum Lesen einzelner Ereignisse wie
read-char
undread-char-exclusive
können Sie hier ein einzelnes Zeichen lesen, aber auch angeben, welche Zeichen als Eingabe zulässig sind:Alle folgenden Optionen akzeptieren entweder "C", "A" oder "O":
Und hier ist ein Beispiel für eine Schleife für die korrekte Eingabe in eine
response
Variable:quelle
read-char-choice
einen, der einen bestimmten Zeichensatz liest.call-interactively
interpretiert die(interactive "cPROMPT")
Spezifikation, wird diec
Option an gesendetread-char
. Daher sollte Folgendes in einem nicht interaktiven Kontext funktionieren:quelle
Die Frage wurde vor langer Zeit beantwortet, aber diese zusätzliche Antwort kann anderen Suchenden helfen.
read-char-choice
Mit dieser Option können Sie eine Liste mit Auswahlmöglichkeiten angeben. Das fn wird erst zurückgegeben, wenn der Benutzer eine dieser gültigen Optionen ausgewählt hat.In dem entarteten Fall, in dem die Optionen einfach Y oder N sind (case insenstive), gibt es
y-or-n-p
.Beide
read-char-choice
undy-or-n-p
sind starr und bestehen auf einer gültigen Antwort. Im ersten Fall muss es eine der von Ihnen angegebenen Optionen sein (wie in meinem Beispiel A, B oder C), und im zweiten Fall muss es Y oder N sein. Wenn der Benutzer die Eingabetaste oder eine andere Taste drückt,y-or-n-p
wird er erneut gefragt. Derread-char-choice
wird einfach still da sitzen. Beides bietet keine Möglichkeit, nur einen Standardwert zurückzugeben. Ich denke, um dieses Verhalten zu erreichen, müssen Sie Ihre eigene Interaktion mitread-char
oder aufbauenread-key
.Nach meiner Erfahrung besteht das Problem mit
read-char
undread-key
allein darin, dass der Cursor im Hauptbearbeitungspuffer verbleibt, während die Eingabeaufforderung im Minibuffer angezeigt wird. Dies ist für den Benutzer desorientiert und unterscheidet sich auch vom Verhalten vonread-string
.Um dies zu vermeiden, können Sie die Variable
cursor-in-echo-area
vor dem Aufrufread-key
den Cursor im Minibuffer anzeigen lassen.quelle