So zeigen Sie einen visuellen Sekundenzeiger an - 10, 9, 8 ,. . die Zeit ist um!

8

Q: Wie kann ich bitte einen visuellen Sekundenzähler einbauen, der verschwindet, wenn eine Option ausgewählt wird oder wenn die Uhr abläuft?

Beispiel - *Messages*Puffer

  • Sie haben 10 Sekunden Zeit, um Ihre Auswahl zu treffen.

  • Sie haben 9 Sekunden Zeit, um Ihre Auswahl zu treffen.

  • . . .

  • Die Zeit ist um!

Ich habe eine Variable, die aufgerufen wird init-variable. Wann non-nillädt Emacs mit einer vollständigen Konfiguration verschiedener Benutzeranpassungen. Wenn nilEmacs mit dem Äquivalent von Emacs -Q- geladen wird, werden keine Benutzeranpassungen geladen. Die Funktion read-char-exclusivehat eine nette Funktion für einen Sekundenzähler, und ich habe diese Funktion in das folgende Code-Snippet aufgenommen. Optionsnummer 1setzt das init-variableauf nil; Optionsnummer 2oder keine Aktion führen zur Standardeinstellung von 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.")) ))
Gesetzesliste
quelle

Antworten:

7

Ich vermute, dass Sie die Countdown-Nachrichtenfunktionalität nicht in die Dokumentationszeichenfolge integrieren können read-char-exclusive. Sie können es jedoch in Ihrem eigenen Timer einpacken:

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

Tatsächlich kann dies ausreichend nützlich sein, um es in eine Funktion einzuschließen. Hier ist eine schnelle Skizze , die für ein paar Funktionen arbeitet, die die gleichen Argumente in der gleichen Reihenfolge nehmen ( read-char, read-char-exclusive, read-event, und vielleicht auch andere) - erstrecken , wie Sie Dinge tun , wie mit read-stringund andere , die eine andere Argumentliste übernehmen:

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

Die Verwendung würde folgendermaßen aussehen:

(countdown-read #'read-char-exclusive "Please enter a character" nil 3)
Dan
quelle
Ja, diese neue Funktion wird in der Tat sehr nützlich sein! Vielen Dank, dass Sie Ihre Antwort um diese erweitert haben - sehr geschätzt.
Lawlist