1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-01-01 01:41:01 -08:00

Base timer-list-mode on tabulated-list-mode (Bug#40854)

* lisp/emacs-lisp/timer-list.el (list-timers)
(timer-list-mode): Inherit from 'tabulated-list-mode' instead of
'special-mode' and make the necessary changes to support that.

* doc/lispref/os.texi (Timers): Update documentation.
This commit is contained in:
Stefan Kangas 2020-04-24 23:42:37 +02:00
parent a2792ad54c
commit ee5c5daad5
2 changed files with 52 additions and 59 deletions

View file

@ -2182,9 +2182,9 @@ cause anything special to happen.
@findex list-timers
The @code{list-timers} command lists all the currently active timers.
There's only one command available in the buffer displayed: @kbd{c}
(@code{timer-list-cancel}) that will cancel the timer on the line
under point.
The command @kbd{c} (@code{timer-list-cancel}) will cancel the timer
on the line under point. You can sort the list by column using the
command @kbd{S} (@code{tabulated-list-sort}).
@node Idle Timers
@section Idle Timers

View file

@ -32,41 +32,49 @@
"List all timers in a buffer."
(interactive)
(pop-to-buffer-same-window (get-buffer-create "*timer-list*"))
(let ((inhibit-read-only t))
(erase-buffer)
(timer-list-mode)
(dolist (timer (append timer-list timer-idle-list))
(insert (format "%4s %10s %8s %s"
;; Idle.
(if (aref timer 7) "*" " ")
(tabulated-list-init-header)
(setq tabulated-list-entries
(mapcar
(lambda (timer)
(list
nil
`[ ;; Idle.
,(propertize
(if (aref timer 7) " *" " ")
'help-echo "* marks idle timers"
'timer timer)
;; Next time.
,(propertize
(let ((time (list (aref timer 1)
(aref timer 2)
(aref timer 3))))
(format "%.2f"
(format "%10.2f"
(float-time
(if (aref timer 7)
time
(time-subtract time nil)))))
'help-echo "Time in sec till next invocation")
;; Repeat.
,(propertize
(let ((repeat (aref timer 4)))
(cond
((numberp repeat)
(format "%.1f" repeat))
(format "%8.1f" repeat))
((null repeat)
"-")
" -")
(t
(format "%s" repeat))))
(format "%8s" repeat))))
'help-echo "Symbol: repeat; number: repeat interval in sec")
;; Function.
,(propertize
(let ((cl-print-compiled 'static)
(cl-print-compiled-button nil)
(print-escape-newlines t))
(cl-prin1-to-string (aref timer 5)))))
(put-text-property (line-beginning-position)
(1+ (line-beginning-position))
'timer timer)
(insert "\n")))
(goto-char (point-min)))
(cl-prin1-to-string (aref timer 5)))
'help-echo "Function called by timer")]))
(append timer-list timer-idle-list)))
(tabulated-list-print))
;; This command can be destructive if they don't know what they are
;; doing. Kids, don't try this at home!
;;;###autoload (put 'list-timers 'disabled "Beware: manually canceling timers can ruin your Emacs session.")
@ -74,35 +82,20 @@
(defvar timer-list-mode-map
(let ((map (make-sparse-keymap)))
(define-key map "c" 'timer-list-cancel)
(define-key map "n" 'next-line)
(define-key map "p" 'previous-line)
(easy-menu-define nil map ""
'("Timers"
["Cancel" timer-list-cancel t]))
map))
(define-derived-mode timer-list-mode special-mode "Timer-List"
(define-derived-mode timer-list-mode tabulated-list-mode "Timer-List"
"Mode for listing and controlling timers."
(setq bidi-paragraph-direction 'left-to-right)
(setq truncate-lines t)
(buffer-disable-undo)
(setq-local revert-buffer-function #'list-timers)
(setq buffer-read-only t)
(setq header-line-format
(concat (propertize " " 'display '(space :align-to 0))
(format "%4s %10s %8s %s"
(propertize "Idle"
'mouse-face 'highlight
'help-echo "* marks idle timers")
(propertize "Next"
'mouse-face 'highlight
'help-echo "Time in sec till next invocation")
(propertize "Repeat"
'mouse-face 'highlight
'help-echo "Symbol: repeat; number: repeat interval in sec")
(propertize "Function"
'mouse-face 'highlight
'help-echo "Function called by timer")))))
(setq tabulated-list-format
'[("Idle" 4)
(" Next" 10)
(" Repeat" 8)
("Function" 0)]))
(defun timer-list-cancel ()
"Cancel the timer on the line under point."