मैं मिनीबफ़र से एक एकल चरित्र कैसे पढ़ सकता हूं?


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)))

तो निम्नलिखित में से सभी "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)

2
वहाँ भी है read-char-choiceजो वर्णों के एक सेट को पढ़ता है।
ग्लूकोज

@glucas: आह, नट, तुम सही हो। लगता है कि मैंने पहिए को फिर से लगा दिया।
दान

4

call-interactively(interactive "cPROMPT")विनिर्देश की व्याख्या क्या है , इसका cविकल्प भेजा जाता है read-char। इसलिए, निम्नलिखित को गैर-संवादात्मक संदर्भ में काम करना चाहिए:

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

4

इस प्रश्न का उत्तर बहुत पहले दिया गया था, लेकिन यह अतिरिक्त उत्तर अन्य खोजकर्ताओं को कुछ सहायता प्रदान कर सकता है।

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)))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.