]> git.eshelyaron.com Git - emacs.git/commitdiff
Base timer-list-mode on tabulated-list-mode (Bug#40854)
authorStefan Kangas <stefankangas@gmail.com>
Fri, 24 Apr 2020 21:42:37 +0000 (23:42 +0200)
committerStefan Kangas <stefankangas@gmail.com>
Tue, 12 May 2020 17:10:03 +0000 (19:10 +0200)
* 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.

doc/lispref/os.texi
lisp/emacs-lisp/timer-list.el

index 5c0b1e2edf0242ecf8aa36d26326e29e41ec165a..8bf48b1dbba3146eeade858687e7a9a08f1f50f8 100644 (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
index 4cebd739c3b6a629fb0898cb891d5dfe5bfc0f14..17e5eb05928424b5a8a9747225f13e1d1d8c0c7c 100644 (file)
   "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) "*" " ")
-                      ;; Next time.
-                     (let ((time (list (aref timer 1)
-                                       (aref timer 2)
-                                       (aref timer 3))))
-                        (format "%.2f"
-                               (float-time
-                                (if (aref timer 7)
-                                    time
-                                  (time-subtract time nil)))))
-                      ;; Repeat.
-                      (let ((repeat (aref timer 4)))
-                        (cond
-                         ((numberp repeat)
-                          (format "%.1f" repeat))
-                         ((null repeat)
-                          "-")
-                         (t
-                          (format "%s" repeat))))
-                      ;; Function.
-                      (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)))
+  (timer-list-mode)
+  (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 "%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 "%8.1f" repeat))
+                   ((null repeat)
+                    "       -")
+                   (t
+                    (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)))
+                '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.")
 (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."