미니 버퍼에서 단일 문자를 어떻게 읽을 수 있습니까?


12

의 일부인 defun경우

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

사용자에게 단일 문자를 묻습니다. RET필요하지 않습니다. 이 판독 동작을 필요없이 어떻게 복제 할 수 interactive있습니까?

답변:


7

read-char내가 추천하는 대신 read-key. 차이점은 and와 read-key같은 일반적인 모든 리매핑 에 따르므로 tty에서 제대로 작동한다는 것입니다.input-decode-mapfunction-key-map


다른 답변 의 정보와 함께 , 이것은 질문에 대한 가장 정확한 답변 인 것 같습니다 :) glucas의 의견 은 다음과 같은 좋은 기능을 제공합니다 :)read-char-choice
Sean Allred

5

and와 같은 단일 이벤트를 읽는 기본 제공 방법 외에도 단일 문자를 읽을 수있는 옵션과 입력 할 수있는 문자를 지정하는 옵션이 있습니다.read-charread-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 December

@ glucas : 아, 견과류, 당신이 맞아요. 바퀴를 다시 발명 한 것 같습니다.
Dan

4

call-interactively(interactive "cPROMPT")사양을 해석하는 것은 c옵션이에 전달됩니다 read-char. 따라서 다음은 비대화 형 컨텍스트에서 작동해야합니다.

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

3

질문은 오래 전에 답변되었지만이 추가 답변은 다른 검색 자에게 도움이 될 수 있습니다.

read-char-choice선택 목록을 지정할 수 있습니다. fn은 사용자가 유효한 옵션 중 하나를 선택할 때까지 반환되지 않습니다.

(read-char-choice "prompt here (A, B, or C)? " '(?A ?B ?C))

옵션이 단순히 Y 또는 N (대소 문자 구분) 인 퇴보 적 인 경우에는 y-or-n-p.

모두 read-char-choicey-or-n-p강성, 유효한 답변을 주장하고있다. 전자의 경우 사용자가 지정한 옵션 중 하나 (예 : A, B 또는 C) 중 하나 여야하며, 후자의 경우 Y 또는 N이어야합니다. 사용자가 Enter 키 또는 다른 키를 누르면 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)))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.