Cara menampilkan penghitung jam detik visual - 10, 9, 8,. . waktunya habis!

8

Q: Bagaimana, tolong, saya bisa menggabungkan penghitung detik visual yang akan hilang ketika opsi dipilih, atau ketika jam habis.

Contoh - *Messages*penyangga

  • Anda memiliki 10 detik untuk menentukan pilihan.

  • Anda memiliki 9 detik untuk menentukan pilihan.

  • . . .

  • Waktunya habis!

Saya memiliki variabel yang disebut init-variable. Kapan non-nil, Emacs dimuat dengan konfigurasi penuh berbagai penyesuaian pengguna. Ketika nil, Emacs dimuat dengan yang setara dengan Emacs -Q- yaitu, tidak ada penyesuaian pengguna yang dimuat. Fungsi ini read-char-exclusivememiliki fitur yang bagus untuk penghitung detik, dan saya telah memasukkan fitur itu ke dalam potongan kode di bawah ini. Nomor opsi 1mengatur init-variableke nil; nomor opsi 2atau tidak ada tindakan menghasilkan pengaturan default 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.")) ))
daftar hukum
sumber

Jawaban:

7

Dari docstringnya, saya menduga Anda tidak dapat memasukkan fungsionalitas pesan hitung mundur ke read-char-exclusive. Namun, Anda dapat membungkusnya di timer Anda sendiri:

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

Sebenarnya, ini mungkin cukup berguna untuk membungkusnya dalam suatu fungsi. Berikut adalah sketsa cepat yang bekerja untuk beberapa fungsi yang mengambil argumen yang sama dalam urutan yang sama ( read-char, read-char-exclusive, read-event, dan mungkin orang lain) - memperpanjang yang Anda suka melakukan hal-hal dengan read-stringdan orang lain yang mengambil daftar argumen yang berbeda:

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

Menggunakannya akan terlihat seperti:

(countdown-read #'read-char-exclusive "Please enter a character" nil 3)
Dan
sumber
Ya, fungsi baru itu memang akan sangat berguna! Terima kasih telah memperluas jawaban Anda untuk memasukkannya - sangat dihargai.
hukum