Comment afficher un compteur visuel d'horloge des secondes - 10, 9, 8,. . le temps est écoulé!

8

Q: Comment, s'il vous plaît, puis-je incorporer un compteur de secondes visuel qui disparaîtra lorsqu'une option est sélectionnée ou lorsque le temps est écoulé.

Exemple - *Messages*tampon

  • Vous avez 10 secondes pour faire votre choix.

  • Vous avez 9 secondes pour faire votre sélection.

  • . . .

  • Le temps est écoulé!

J'ai une variable qui s'appelle init-variable. Quand non-nil, Emacs se charge avec une configuration complète de diverses personnalisations utilisateur. Lorsque nilEmacs se charge avec l'équivalent de Emacs -Q- c'est-à-dire, aucune personnalisation utilisateur n'est chargée. La fonction read-char-exclusivea une fonctionnalité intéressante pour un compteur de secondes, et j'ai intégré cette fonctionnalité dans l'extrait de code ci-dessous. Option numéro 1fixe le init-variableà nil; le numéro d'option 2ou aucune action ne donne le réglage par défaut de 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.")) ))
liste des lois
la source

Réponses:

7

D'après sa docstring, je suppose que vous ne pouvez pas incorporer la fonctionnalité de message de compte à rebours read-char-exclusive. Cependant, vous pouvez le terminer dans votre propre minuteur:

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

En fait, cela pourrait être suffisamment utile pour le résumer dans une fonction. Voici un croquis rapide qui fonctionne pour quelques fonctions qui prennent les mêmes arguments dans le même ordre ( read-char, read-char-exclusive, read-event, et peut - être d' autres) - étendre que vous aimez faire les choses avec read-stringet d' autres qui prennent une liste d'arguments différents:

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

Son utilisation ressemblerait à:

(countdown-read #'read-char-exclusive "Please enter a character" nil 3)
Dan
la source
Oui, cette nouvelle fonction sera en effet très utile! Merci d'avoir étendu votre réponse pour l'inclure - très appréciée.
lawlist