উত্তর:
একক ইভেন্ট যেমন 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)))
সুতরাং নীচের সমস্তগুলি "সি", "এ", বা "ও" হয় গ্রহণ করবে:
(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
আপনাকে পছন্দগুলির তালিকা নির্দিষ্ট করতে দেয় allows ব্যবহারকারী যতক্ষণ না সেই বৈধ বিকল্পগুলির মধ্যে একটি নির্বাচন না করে অবধি 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
।
এটি এড়াতে, আপনি মিনিবুফারে কার্সারটি প্রদর্শন করার 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