https://www.asciimator.net/projects/clocks/?cid=8016 有个动画时钟,我试着在 Emacs 中实现了:
代码:
(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))))))