ASCII 动图时钟

https://www.asciimator.net/projects/clocks/?cid=8016 有个动画时钟,我试着在 Emacs 中实现了:

59

代码:

(defun clock ()
  (interactive)
  (cl-labels ((split (n) (list (/ n 10) (- n (* (/ n 10) 10))))
              (time () (seq-let (s m h) (decode-time)
                         (append (split h) (split m) (split s))))
              (vconcat (&rest r)
                       (let* ((height (length (split-string (car r) "\n")))
                              (strings (mapcar
                                        (lambda (e)
                                          (if (stringp e)
                                              (split-string e "\n")
                                            (make-list height (make-string e ? ))))
                                        r)))
                         (mapconcat #'identity
                                    (apply #'cl-mapcar #'concat strings) "\n")))
              (make (n)
                    (with-temp-buffer
                      (insert "  _  "  "\n"
                              " | | " "\n")
                      (let ((i 18))
                        (while (>= i 0)
                          (insert (format "%s|%s| \n"
                                          (if (zerop (% i 2)) (/ i 2) " ")
                                          (cond ((> i (* n 2)) " ")
                                                ((= n (/ i 2.0)) "▄")
                                                (t "█"))))
                          (setq i (- i 1))))
                      (insert "(███)")
                      (buffer-string))))
    (with-current-buffer (get-buffer-create "*Clock*")
      (switch-to-buffer (current-buffer))
      (setq buffer-undo-list t)
      (setq cursor-type nil)
      (while t
        (seq-let (h1 h0 m1 m0 s1 s0) (time)
          (erase-buffer)
          (insert (vconcat (make h1) 1 (make h0)
                           4
                           (make m1) 1 (make m0)
                           4
                           (make s1) 1 (make s0)))
          (insert "\n\n")
          (insert (format "    %d%d      :      %d%d      :      %d%d"
                          h1 h0 m1 m0 s1 s0))
          (sit-for 0.1 t)
          (discard-input)
          (redisplay))))))
8 个赞