Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Permanently change the state of abbreviated display of a piece of code?

Tags:

emacs

In *scratch* buffer in Emacs Lisp after you evaluated an expression that evaluates to a complex Lisp form, that form is "abbreviated", i.e. some long lists or its inner parts are replaced by ellipses. Looks something like:

(let* ((--3 (make-hash-table)) d c (--5 (let ... ... ...)) (--6 0) (--0 (make-
hash-table)) b a (--1 0) --7) (catch (quote --2) (maphash (lambda ... ... ... 
... ... ... ...) --0)) (nreverse --7))

vs expanded version:

(let* ((--3 (make-hash-table)) d c (--5 (let (--4) (maphash (lambda (k v) 
(setq --4(cons k --4))) --3) (nreverse --4))) (--6 0) (--0 (make-hash-table)) 
b a (--1 0) --7) (catch (quote --2) (maphash (lambda (k v) (when (or (> --6 
150) (> --1 100)) (throw (quote --2) nil)) (setq a k b v) (setq c (car --5) d 
(gethash (car --5) --3) --5 (cdr --5)) (incf --6) (setq --7 (cons (list (cons 
a b) (cons c d)) --7)) (message "a: %s, b: %s, c: %s, d: %s" a b c d)) --0)) 
(nreverse --7))

If I press RET in the expanded or collapsed state, it toggles the state back. Obviously, my first reaction is to try to format the output, so I press RET! And then it will either collapse or expand, depends on whichever state it was in. If I copy and paste the whole thing, then it is treated as normal text, but is there a faster way of doing it? I.e. I would like to permanently expand it, w/o having to copy-paste.

I couldn't find the function which toggles the state (perhaps I'm calling it incorrectly). It took me a while to realize it was possible to toggle it anyway (yeah, it displays that in a tooltip, but who uses mouse in Emacs?).

Also, I, in general, like the idea, is it possible to apply it to other languages too? Where can I read more about this feature?


1 Answers

Two variables control the print out of results of eval-expression. in the *scratch* buffer:

eval-expression-print-length
eval-expression-print-level

You could set those to nil and the result would always be expanded.

If you just want the RET to switch to the fully expanded (and not to toggle), you can use this advice to strip the text properties which enable the toggling of display state:

(defadvice last-sexp-toggle-display (after last-sexp-toggle-display-only-long-form activate)
  "After the function is called, check to see if the long form had been displayed, and if so, remove property enabling toggling"
  (save-restriction
    (widen)
    (let ((value (get-text-property (point) 'printed-value)))
      (when value
        (let ((beg (or (previous-single-property-change (min (point-max) (1+ (point)))
                                                        'printed-value)
                       (point)))
              (end (or (next-single-char-property-change (point) 'printed-value) (point)))
              (standard-output (current-buffer))
              (point (point)))
          (if (< (length (nth 1 value)) (length (nth 2 value)))
              (remove-text-properties beg end '(printed-value))))))))
like image 122
Trey Jackson Avatar answered Sep 07 '25 19:09

Trey Jackson



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!