Навсегда изменить состояние сокращенного отображения фрагмента кода?

В буфере *scratch* в Emacs Lisp после того, как вы вычислили выражение, которое дает сложную форму Lisp, эта форма "сокращается", т.е. некоторые длинные списки или их внутренние части заменяются многоточием. Выглядит примерно так:

(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))

против расширенной версии:

(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?).

Также мне, в целом, идея нравится, можно ли ее применить и к другим языкам? Где я могу прочитать больше об этой функции?


person Community    schedule 26.11.2012    source источник


Ответы (1)


Две переменные управляют распечаткой результатов 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))))))))
person Trey Jackson    schedule 26.11.2012