Bir parçası olduğunda defun
,
(interactive "c(C)hoose (A)n (O)ption")
kullanıcıdan tek bir karakter girmesini ister; RET
gerekli değil. Bu okuma davranışına ihtiyaç duymadan nasıl çoğaltabilirim interactive
?
Bir parçası olduğunda defun
,
(interactive "c(C)hoose (A)n (O)ption")
kullanıcıdan tek bir karakter girmesini ister; RET
gerekli değil. Bu okuma davranışına ihtiyaç duymadan nasıl çoğaltabilirim interactive
?
Yanıtlar:
Ek olarak dahili tek olayları okumak için yollar gibi read-char
ve read-char-exclusive
burada tek bir karakter okumak için bir seçenek, ama aynı zamanda kabul edilebilir girdi hangi karakterler belirtin:
(defun read-char-picky (prompt chars &optional inherit-input-method seconds)
"Read characters like in `read-char-exclusive', but if input is
not one of CHARS, return nil. CHARS may be a list of characters,
single-character strings, or a string of characters."
(let ((chars (mapcar (lambda (x)
(if (characterp x) x (string-to-char x)))
(append chars nil)))
(char (read-char-exclusive prompt inherit-input-method seconds)))
(when (memq char chars)
char)))
Dolayısıyla, aşağıdakilerin tümü "C", "A" veya "O" kabul eder:
(read-char-picky "(C)hoose (A)n (O)ption: " "CAO")
(read-char-picky "(C)hoose (A)n (O)ption: " '("C" "A" "O"))
(read-char-picky "(C)hoose (A)n (O)ption: " '(?C ?A ?O))
Ve bir response
değişkene doğru girdi için döngü oluşturmanın örnek bir yolu :
(let (response)
(while (null (setq response
(read-char-picky "(C)hoose (A)n (O)ption: " "CAO")))
(message "Please pick one of \"C\", \"A\", or \"O\"!")
(sit-for .5))
response)
read-char-choice
belirli bir karakter kümesinden birini okuyanlar da vardır.
Soru uzun zaman önce cevaplandı, ancak bu ek cevap diğer araştırmacılara biraz yardım sağlayabilir.
read-char-choice
bir seçenek listesi belirlemenizi sağlar. Fn, kullanıcı bu geçerli seçeneklerden birini seçinceye kadar geri dönmez.
(read-char-choice "prompt here (A, B, or C)? " '(?A ?B ?C))
Seçeneklerin sadece Y veya N (dezenfekte edici) olduğu dejenere durumda vardır y-or-n-p
.
Hem read-char-choice
ve y-or-n-p
sert olan ve geçerli bir cevap ısrar ediyorlar. Önceki durumda, belirttiğiniz seçeneklerden biri olmalıdır (örneğimde A, B veya C gibi) ve ikinci durumda Y veya N olmalıdır. Kullanıcı enter veya başka bir tuşa basarsa, y-or-n-p
tekrar sorulur. read-char-choice
Sadece sessiz, orada oturacak. İkisi de varsayılana dönmenin bir yolunu sunmaz. Bu davranışı elde etmek için, sanırım read-char
veya ile kendi etkileşiminizi kurmalısınız read-key
.
Benim tecrübelerime göre, read-char
ve read-key
tek başına sorun , minibuffer'da istemi görüntülerken, imlecin ana düzenleme arabelleğinde kalmasıdır. Bu kullanıcı için yönünü şaşırtır ve aynı zamanda davranışlarından farklıdır read-string
.
Bunu önlemek için, çağrmadan cursor-in-echo-area
önce değişkenin read-key
imleci minibuffer'da görüntülemesine izin verebilirsiniz .
(defun my-y-or-n-with-default (raw-prompt &optional default-yes)
"displays PROMPT in the minibuffer, prompts for a y or n,
returns t or nil accordingly. If neither Y or N is entered, then
if DEFAULT-YES, returns t, else nil."
(let* ((options-string (if default-yes "Y or n" "y or N"))
(prompt (concat raw-prompt "(" options-string ")? "))
(cursor-in-echo-area t)
(key (read-key (propertize prompt 'face 'minibuffer-prompt)))
(isyes (or (eq key ?y) (eq key ?Y)))
(isno (or (eq key ?n) (eq key ?N))))
(if (not (or isyes isno))
default-yes
isyes)))
read-char-choice