From e1e3e5ea4896e9582428ab4194bf9051e536360f Mon Sep 17 00:00:00 2001 From: Kjetil Orbekk Date: Thu, 1 Feb 2024 21:55:37 -0500 Subject: update --- emacs/.config/emacs/lisp/kj-init.el | 1 + emacs/.config/emacs/lisp/kj-timer.el | 47 ++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 emacs/.config/emacs/lisp/kj-timer.el diff --git a/emacs/.config/emacs/lisp/kj-init.el b/emacs/.config/emacs/lisp/kj-init.el index 0303569..4766674 100644 --- a/emacs/.config/emacs/lisp/kj-init.el +++ b/emacs/.config/emacs/lisp/kj-init.el @@ -946,5 +946,6 @@ (put 'narrow-to-region 'disabled nil) (put 'downcase-region 'disabled nil) (put 'upcase-region 'disabled nil) +(put 'list-timers 'disabled nil) (provide 'kj-init) diff --git a/emacs/.config/emacs/lisp/kj-timer.el b/emacs/.config/emacs/lisp/kj-timer.el new file mode 100644 index 0000000..6e200a7 --- /dev/null +++ b/emacs/.config/emacs/lisp/kj-timer.el @@ -0,0 +1,47 @@ +;;; kj-timer.el -- countdown timer -*- lexical-binding: t -*- + +(defun kj/display-timer (seconds current &optional next) + (with-current-buffer (get-buffer-create "*timer*") + (let* ((stopped (< seconds 0)) + (seconds (if stopped 0 (truncate seconds)))) + (erase-buffer) + (insert + (propertize (format "%02d:%02d" (/ seconds 60) + (% seconds 60)) + 'face + (append '(:height 1000) + (when stopped + '(:inherit 'org-imminent-deadline)))) + "\n" (propertize (concat current " ยท " (if next next "done")) + 'face '(:foreground "gray" :height 500))) + (set-left-margin (point-min) (point-max) 10)))) + +(defvar kj/current-timer nil) +(defvar kj/roster nil) +(defvar kj/timer-seconds) + +(defun kj/run-single-timer (seconds current next) + (let* ((stop-time (+ (float-time) seconds)) + (display-fn (lambda () + (kj/display-timer + (- stop-time (float-time)) + current next)))) + (setq kj/current-timer (run-at-time t 0.5 display-fn)))) + +(defun kj/timer (seconds &rest roster) + (with-current-buffer (get-buffer-create "*timer*") + (display-buffer (current-buffer)) + (setq cursor-type nil) + (use-local-map (define-keymap "SPC" 'kj/timer-next)) + (setq kj/roster roster) + (setq kj/timer-seconds seconds) + (kj/timer-next))) + +(defun kj/timer-next () + (interactive) + (unless kj/roster + (error "The timers are done.")) + (when kj/current-timer + (cancel-timer kj/current-timer)) + (kj/run-single-timer kj/timer-seconds (nth 0 kj/roster) (nth 1 kj/roster)) + (setq kj/roster (cdr kj/roster))) -- cgit v1.2.3