আমি মিনিবাসার থেকে একটি চরিত্র কীভাবে পড়তে পারি?


12

যখন একটি অংশ defun,

(interactive "c(C)hoose (A)n (O)ption")

ব্যবহারকারীকে একটি একক চরিত্রের জন্য অনুরোধ জানাবে; RETএটা দরকারি না. প্রয়োজন ছাড়া আমি কীভাবে এই পড়ার আচরণের প্রতিলিপি করতে পারি interactive?

উত্তর:


7

বরং read-charআমি সুপারিশ read-key। পার্থক্যটি হ'ল read-keyযেমন input-decode-mapএবং সমস্ত স্বাভাবিক রিমপিংস মান্য করে এবং function-key-mapতাই এটি একটি টিটিআইতে সঠিকভাবে কাজ করবে।


অন্য উত্তরে তথ্যের সাথে যুক্ত, এটি জিজ্ঞাসা করা প্রশ্নের সুনির্দিষ্ট উত্তর বলে মনে হচ্ছে :) গ্লুকাসের মন্তব্যটি একটি ভাল ফাংশন সরবরাহ করে যদিও :)read-char-choice
সান অলরেড

5

একক ইভেন্ট যেমন 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)

2
এমনও রয়েছে read-char-choiceযা প্রদত্ত একটি অক্ষরের একটি সেট পড়ে।
গ্লুকাস

@ গ্লুকাস: আহ, বাদাম, আপনি ঠিক বলেছেন। দেখে মনে হচ্ছে আমি চাকাটি নতুন করে এনেছি।
ড্যান

4

call-interactively(interactive "cPROMPT")স্পেসিফিকেশন ব্যাখ্যা করে কি , cবিকল্প প্রেরণ করা হয় read-char। সুতরাং, নিম্নলিখিতগুলি একটি অ-ইন্টারেক্টিভ প্রসঙ্গে কাজ করা উচিত:

(read-char "(C)hoose (A)n (O)ption")

3

প্রশ্নের উত্তর অনেক আগেই দেওয়া হয়েছিল, তবে এই অতিরিক্ত উত্তরটি অন্যান্য অনুসন্ধানকারীদের কিছুটা সহায়তা দিতে পারে।

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)))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.