merlyn@intelob.intel.com (Randal L. Schwartz @ Stonehenge) (01/26/89)
Here's a cute little time-waster I came up with a while ago. Great thing to leave your terminal with (insecurely)... makes it the world's most expensive and least portable digital watch. If you define 'you-have-mail-p', and it returns non-nil when you have mail, this screen hack will make use of that knowledge. See comments for other details. Flames by email... (if your mailer can get to me, sheesh...) -- Randal L. Schwartz, Stonehenge Consulting Services (503)777-0095 on contract to BiiN (for now :-), Hillsboro, Oregon, USA. ARPA: <@iwarp.intel.com:merlyn@intelob.intel.com> (fastest!) MX-Internet: <merlyn@intelob.intel.com> UUCP: ...[!uunet]!tektronix!biin!merlyn Standard disclaimer: I *am* my employer! "Welcome to Oregon... home of the California Raisins!" --- CUT HERE (no .signature at end, I hope) --- ;;; A little display hack by merlyn ;;; LastEditDate="Fri Nov 25 10:07:40 1988" ;;; Notes: ;;; * format of (current-time-string) must be something like UNIX ctime(3). ;;; * if defined, (you-have-mail-p) returning non-nil will be noticed. ;;; * tcp service "quote" provides the cute remarks -- you might have to ;;; replace it with a call to "fortune" or "yow" if unavailable (defun show-time (&optional sleeptime) "Display the current time repeatedly in large characters. Optional SLEEPTIME gives number of seconds between updates (default is 5 seconds). Any input pending terminates the loop, and restores the original screen configuration (if the input is a space character, it is discarded). If SLEEPTIME is negative, append a cute quote to the time." (interactive "P") (setq sleeptime (cond ((null sleeptime) 5) ((eq sleeptime '-) -10) (t (prefix-numeric-value sleeptime)))) (save-window-excursion (switch-to-buffer-other-window (generate-new-buffer " show-time")) (unwind-protect (progn (delete-other-windows) (set (make-local-variable 'mode-line-inverse-video) inverse-video) (setq mode-line-format "") (while (progn (erase-buffer) (insert "At the tone, the time will be...\n\n") (let* ((ctime (current-time-string)) (ignore (string-match "\\(..\\):\\(..\\):\\(..\\)" ctime)) (hms (mapcar (function (lambda (n) (string-to-int (substring ctime (match-beginning n) (match-end n))))) '(1 2 3)))) (show-time-banner (format " %d:%02d:%02d %s" (1+ (% (+ (nth 0 hms) 11) 12)) (nth 1 hms) (nth 2 hms) (if (< (nth 0 hms) 12) "AM" "PM")))) (message (or (and (fboundp 'you-have-mail-p) (you-have-mail-p) "You have mail.") "")) (cond ((< sleeptime 0) (insert "\n\n") (let ((prc (open-network-stream "Quote" nil (system-name) "quote"))) (set-marker (process-mark prc) (point-marker)) (backward-char 1) (set-process-filter prc (function (lambda (prc txt) (let* ((pm (process-mark prc)) (buf (marker-buffer pm)) (pos (marker-position pm)) (md (match-data))) (unwind-protect (if buf (save-excursion (set-buffer buf) (goto-char pos) (insert txt) (save-restriction (narrow-to-region pos (point)) (goto-char (point-min)) (while (re-search-forward "\^M" nil t) (replace-match "")) (goto-char (point-min)) (while (re-search-forward "[ -~]\^H" nil t) (replace-match "") (if (> (point) (point-min)) (backward-char 1))) (set-marker pm (point-max))))) (store-match-data md))))))) (sit-for (- sleeptime))) (t (sit-for sleeptime)))))) (kill-buffer (current-buffer)))) (and (input-pending-p) (= 32 (setq unread-command-char (read-char))) (setq unread-command-char -1)) (sit-for 0)) (defun show-time-banner (string) "Insert STRING as tall characters over the next five lines. Presumes point is already at the beginning of a line. Used by show-time." (insert (mapconcat (function (lambda (line) (mapconcat (function (lambda (char) (let ((this-char (assq char show-time-banner-chars))) (if this-char (nth line this-char) "")))) string " "))) '(1 2 3 4 5) "\n"))) (defconst show-time-banner-chars '((?0 " 000 " "0 0" "0 0" "0 0" " 000 ") (?1 " 1 " " 11 " " 1 " " 1 " "11111") (?2 "2222 " " 2" " 222 " "2 " "22222") (?3 "3333 " " 3" " 333 " " 3" "3333 ") (?4 " 4" " 44" " 4 4" " 4444" " 4") (?5 "55555" "5 " "5555 " " 5" "5555 ") (?6 " 666 " "6 " "6666 " "6 6" " 666 ") (?7 "77777" " 7" " 7 " " 7 " " 7 ") (?8 " 888 " "8 8" " 888 " "8 8" " 888 ") (?9 " 999 " "9 9" " 9999" " 9" " 999 ") (?: "::" "::" " " "::" "::") (?\040 " " " " " " " " " ") (?A " AA " "A A" "AAAA" "A A" "A A") (?M "M M" "MM MM" "M M M" "M M" "M M") (?P "PPPP " "P P" "PPPP " "P " "P ")) "An alist of (char . (5-strings)) used by show-time-banner. All 5 strings must be the same length for any given character, and in top-to-bottom order.")