Cách hiển thị đồng hồ đếm giây trực quan - 10, 9, 8 ,. . hết giờ rồi!


8

Q: Làm thế nào, làm ơn, tôi có thể kết hợp bộ đếm giây trực quan sẽ biến mất khi tùy chọn được chọn hoặc khi hết giờ.

Ví dụ - *Messages*bộ đệm

  • Bạn có 10 giây để thực hiện lựa chọn của mình.

  • Bạn có 9 giây để lựa chọn.

  • . . .

  • Hết giờ rồi!

Tôi có một biến được gọi là init-variable. Khi non-nil, Emacs tải với cấu hình đầy đủ các tùy chỉnh người dùng khác nhau. Khi nil, Emacs tải tương đương với Emacs -Q- tức là không có tùy chỉnh người dùng nào được tải. Chức năng read-char-exclusivenày có một tính năng hay cho bộ đếm giây và tôi đã kết hợp tính năng đó vào đoạn mã bên dưới. Số tùy chọn 1đặt init-variablethành nil; số tùy chọn 2hoặc không có kết quả hành động trong cài đặt mặc định của non-nil.

(defvar init-variable t)

(let* (
    (emacs-q (read-char-exclusive nil nil 10)))
  (cond
    ((eq emacs-q ?1)
      (setq init-variable nil)
      (message "Emacs -Q"))
    ((eq emacs-q ?2)
      (message "Regular Loading."))
    (t (message "This is the default.")) ))

Câu trả lời:


7

Từ chuỗi tài liệu của nó, tôi đoán rằng bạn không thể kết hợp chức năng tin nhắn đếm ngược vào read-char-exclusive. Tuy nhiên, bạn có thể gói nó trong bộ đếm thời gian của riêng bạn:

(let ((choice nil)
      (count  3))
  (while (>= count 0)
    (message (format "Seconds left to make your choice: %d" count))
    (setq count (if (setq choice (read-char-exclusive nil nil 1))
                    -1
                  (1- count))))
  (cond ((eq choice ?1)
         (message "You entered 1"))
        ((eq choice ?2)
         (message "You entered 2"))
        (t
         (message "The default"))))

Trên thực tế, điều này có thể đủ hữu ích để gói nó trong một chức năng. Dưới đây là một phác thảo nhanh chóng mà làm việc cho một vài chức năng mà lấy lý lẽ tương tự theo thứ tự ( read-char, read-char-exclusive, read-event, và có lẽ những người khác) - mở rộng như bạn muốn làm việc với read-stringvà những người khác mà phải mất một danh sách đối số khác nhau:

(defun countdown-read (fnx &optional prompt inherit-input-method seconds)
  "Reads a character or event and provides a countdown of SECONDS
to provide input.  Return nil if no input arrives in time.

FNX is a function that supports the rest of the
arguments (currently, `read-char', `read-char-exclusive',
`read-event', and maybe others).
If the optional argument PROMPT is non-nil, display that as a
prompt.
If the optional argument INHERIT-INPUT-METHOD is non-nil and some
input method is turned on in the current buffer, that input
method is used for reading a character.
If the optional argument SECONDS is non-nil, it should be a
number specifying the maximum number of seconds to wait for
input (default: 5)."
  (let (choice (seconds (or seconds 5)))
    (while (>= seconds 0)
      (message (format (concat (or prompt "") " (%d): ") seconds))
      (setq seconds (if (setq choice
                              (funcall fnx nil inherit-input-method 1))
                        -1
                      (1- seconds))))
    choice))

Sử dụng nó sẽ trông như:

(countdown-read #'read-char-exclusive "Please enter a character" nil 3)

Vâng, chức năng mới đó thực sự sẽ rất hữu ích! Cảm ơn bạn đã mở rộng câu trả lời của bạn để bao gồm nó - đánh giá rất cao.
luật
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.