Come visualizzare un contatore dell'orologio dei secondi visivo - 10, 9, 8,. . tempo scaduto!


8

Q: Come, per favore, posso incorporare un contatore visivo dei secondi che scompare quando viene selezionata un'opzione o quando scade il tempo.

Esempio - *Messages*buffer

  • Hai 10 secondi per effettuare la selezione.

  • Hai 9 secondi per effettuare la selezione.

  • . . .

  • Tempo scaduto!

Ho una variabile che si chiama init-variable. Quando non-nil, Emacs si carica con una configurazione completa di varie personalizzazioni dell'utente. Quando nil, Emacs viene caricato con l'equivalente di Emacs -Q- ovvero, non vengono caricate personalizzazioni dell'utente. La funzione read-char-exclusiveha una bella funzione per un contatore di secondi e ho incorporato quella funzione nello snippet di codice qui sotto. Il numero di opzione 1imposta il init-variablea nil; il numero di opzione 2o nessuna azione determinano l'impostazione predefinita di 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.")) ))

Risposte:


7

Dalla sua dotstring, immagino che non puoi incorporare la funzionalità del messaggio di conto alla rovescia in read-char-exclusive. Tuttavia, puoi avvolgerlo nel tuo timer:

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

In realtà, questo potrebbe essere sufficientemente utile per racchiuderlo in una funzione. Ecco un rapido schizzo che funziona per un paio di funzioni che prendono gli stessi argomenti nello stesso ordine ( read-char, read-char-exclusive, read-event, e forse altri) - estendere come ti piace fare le cose con read-stringe altre che prendono un elenco di argomenti diversi:

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

Usarlo sarebbe simile a:

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

Sì, quella nuova funzione sarà davvero molto utile! Grazie per aver esteso la tua risposta per includerla - molto apprezzato.
elenco delle leggi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.