Como exibir um contador visual de segundos - 10, 9, 8,. . acabou o tempo!


8

Q: Como incorporar um contador visual de segundos que desaparecerá quando uma opção for selecionada ou quando o relógio se esgotar.

Exemplo - *Messages*buffer

  • Você tem 10 segundos para fazer sua escolha.

  • Você tem 9 segundos para fazer sua seleção.

  • . . .

  • Acabou o tempo!

Eu tenho uma variável que é chamada init-variable. Quando non-nil, o Emacs é carregado com uma configuração completa de várias personalizações do usuário. Quando o nilEmacs é carregado com o equivalente a Emacs -Q- ou seja, nenhuma personalização do usuário é carregada. A função read-char-exclusivepossui um recurso interessante para um contador de segundos, e eu o incorporei no snippet de código abaixo. O número da opção 1define init-variablecomo nil; número da opção 2ou nenhuma ação resultam na configuração padrão 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.")) ))

Respostas:


7

Pela sua documentação, acho que você não pode incorporar a funcionalidade da mensagem de contagem regressiva read-char-exclusive. No entanto, você pode envolvê-lo em seu próprio 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"))))

Na verdade, isso pode ser suficientemente útil para envolvê-lo em uma função. Aqui está um esboço rápido que funciona para algumas funções que recebem os mesmos argumentos na mesma ordem ( read-char, read-char-exclusive, read-event, e talvez outros) - estender-se você gosta de fazer as coisas com read-stringe outros que levam um lista de argumentos diferente:

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

Usá-lo ficaria assim:

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

Sim, essa nova função será realmente muito útil! Obrigado por estender sua resposta para incluí-la - muito apreciada.
lawlist
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.