Subject: Re: bug#64536: 30.0.50; Make cl-print put buttons on ellipses

From: Stefan Monnier <[email-masked]>
Date: Sat, 12 Aug 2023 01:23:03 -0400

>> -;; Define button type used for ...'s.
>> -;; Set skip property so you don't have to TAB through 100 of them to
>> -;; get to the next function name.
>> -(define-button-type 'backtrace-ellipsis
>> -  'skip t 'action #'backtrace-expand-ellipsis
>> -  'help-echo "mouse-2, RET: expand this ellipsis")
>
> Isn't this a breaking change?
> I just got inspector.el broken because it uses 'backtrace-ellipsis
> button type.

Apparently it's a breaking change, indeed.

Hmm... we could re-add it, but with the new `cl-print.el` your code
should simply not use `backtrace-ellipsis` at all because `cl-print.el`
did it for you already.

IOW, I think a patch like the one below my sig is the better option.

> At least, I'd expect to see the removal documented in NEWS.

How 'bout:

     The code that allowed "..." to be expanded in the "*Backtrace*" buffer
     should now work anywhere the data is generated by 'cl-print'.
     
    +*** The 'backtrace-ellipsis' button is replaced by 'cl-print-ellipsis'.
    +
     *** hash-tables' contents can be expanded via the ellipsis.
     
    +*** Modes can control the expansion via 'cl-print-expand-ellipsis-function'.
    +
     ** Modeline elements can now be right-aligned.
     Anything following the symbol 'mode-line-format-right-align' in
     'mode-line-format' will be right-aligned.  Exactly where it is

-- Stefan

diff --git a/inspector.el b/inspector.el
index fa9b1cc778..e00209f2be 100644
--- a/inspector.el
+++ b/inspector.el
@@ -1,6 +1,6 @@
 ;;; inspector.el --- Tool for inspection of Emacs Lisp objects  -*- lexical-binding: t -*-
 
-;; Copyright (C) 2021-2022 Free Software Foundation, Inc.
+;; Copyright (C) 2021-2023 Free Software Foundation, Inc.
 
 ;; Author: Mariano Montone <[email-masked]>
 ;; URL: https://github.com/mmontone/emacs-inspector
@@ -243,13 +243,14 @@ LIMIT controls the truncation."
     (put-text-property (point-min) (point) 'inspector-form (gensym))
     ;; Make buttons from all the "..."s.  Since there might be many of
     ;; them, use text property buttons.
-    (goto-char (point-min))
-    (while (< (point) (point-max))
-      (let ((end (next-single-property-change (point) 'cl-print-ellipsis
-                                              nil (point-max))))
-        (when (get-text-property (point) 'cl-print-ellipsis)
-          (make-text-button (point) end :type 'backtrace-ellipsis))
-        (goto-char end)))
+    (unless (boundp 'cl-print-expand-ellipsis-function) ;Emacs-30
+      (goto-char (point-min))
+      (while (< (point) (point-max))
+        (let ((end (next-single-property-change (point) 'cl-print-ellipsis
+                                                nil (point-max))))
+          (when (get-text-property (point) 'cl-print-ellipsis)
+            (make-text-button (point) end :type 'backtrace-ellipsis))
+          (goto-char end))))
     (buffer-string)))
 
 (cl-defgeneric inspector--face-for-object (object)