जवाबों:
के अलावा में निर्मित तरीके एकल घटनाओं को पढ़ने के लिए इस तरह के रूप read-charऔर read-char-exclusive, यहाँ एक भी चरित्र को पढ़ने के लिए एक विकल्प है, लेकिन यह भी निर्दिष्ट जो वर्ण स्वीकार्य इनपुट कर रहे हैं:
(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)))
तो निम्नलिखित में से सभी "C", "A" या "O" को स्वीकार करेंगे:
(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))
और एक responseचर में सही इनपुट के लिए लूप का एक उदाहरण तरीका है :
(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जो वर्णों के एक सेट को पढ़ता है।
इस प्रश्न का उत्तर बहुत पहले दिया गया था, लेकिन यह अतिरिक्त उत्तर अन्य खोजकर्ताओं को कुछ सहायता प्रदान कर सकता है।
read-char-choiceआपको विकल्पों की सूची निर्दिष्ट करने की अनुमति देता है। जब तक उपयोगकर्ता उन वैध विकल्पों में से एक का चयन नहीं करता, तब तक fn वापस नहीं आएगा।
(read-char-choice "prompt here (A, B, or C)? " '(?A ?B ?C))
पतित मामले में जिसमें विकल्प केवल वाई या एन (मामला असंवेदनशील) हैं, वहाँ है y-or-n-p।
दोनों read-char-choiceऔर y-or-n-pकठोर होते हैं, और एक मान्य जवाब पर जोर देते हैं। पूर्व मामले में, यह आपके द्वारा निर्दिष्ट विकल्पों में से एक होना चाहिए (जैसे मेरे उदाहरण में ए, बी या सी), और बाद के मामले में, यह वाई या एन होना चाहिए। यदि उपयोगकर्ता प्रवेश करता है या कोई अन्य कुंजी दबाता है, तो y-or-n-pवह फिर से पूछेगा। read-char-choiceसिर्फ वहाँ बैठना, मूक होगा। न तो केवल एक डिफ़ॉल्ट लौटने का एक तरीका प्रदान करता है। उस व्यवहार को प्राप्त करने के लिए, मुझे लगता है कि आपको अपना स्वयं का इंटरैक्शन बनाने के लिए मिला है read-charया read-key।
मेरे अनुभव में, अकेले read-charऔर साथ समस्या read-keyयह है कि जब वे मिनीबफ़र में संकेत प्रदर्शित करते हैं, तो कर्सर मुख्य संपादन बफर में रहता है। यह उपयोगकर्ता के लिए भटकाव है, और के व्यवहार के विपरीत भी है read-string।
THAT से बचने के लिए, आप मिनीबार में कर्सर प्रदर्शित करने के cursor-in-echo-areaलिए कॉल read-keyकरने से पहले वैरिएबल को दे सकते हैं ।
(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