在评估一个复杂的Lisp形式的表达式后,在Emacs Lisp中的* scratch *缓冲区中,该形式是“缩写”,即一些长列表或其内部部分被省略号替换。看起来像:
(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扩展版:
(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))
如果我在展开或折叠状态下按 RET ,它会切换回状态。显然,我的第一反应是尝试格式化输出,所以我按 RET !然后它将崩溃或扩展,取决于它所处的状态。如果我复制并粘贴整个事物,那么它被视为普通文本,但有更快的方法吗?即我想永久扩展它,无需复制粘贴。
我找不到切换状态的功能(也许我正在调用它)。我花了一段时间才意识到无论如何都可以切换它(是的,它显示在工具提示中,但是谁在Emacs中使用鼠标?)。
另外,总的来说,我喜欢这个想法,是否可以将其应用到其他语言?我在哪里可以阅读有关此功能的更多信息?
答案 0 :(得分:4)
两个变量控制打印eval-expression
的结果。在*scratch*
缓冲区中:
eval-expression-print-length
eval-expression-print-level
您可以将这些设置为nil
,结果将始终展开。
如果您只是希望 RET 切换到完全展开(而不是切换),您可以使用此建议去除允许切换显示状态的文本属性:
(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))))))))