aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGemini Lasswell2018-06-23 10:25:29 -0700
committerGemini Lasswell2018-08-03 08:53:02 -0700
commitbb9de872e86372c8a2475503e6be6b6bd64e06d6 (patch)
treead1184a720260eb7ec2a3ae38815ddc75b038e61
parentd6b364edfe582be24cb54693c5aaf52c0add22d5 (diff)
downloademacs-bb9de872e86372c8a2475503e6be6b6bd64e06d6.tar.gz
emacs-bb9de872e86372c8a2475503e6be6b6bd64e06d6.zip
Add prefix argument to backtrace-toggle-print-circle
With prefix argument, toggle print-circle for the whole buffer. * lisp/emacs-lisp/backtrace.el (backtrace-toggle-print-circle): Add universal prefix argument. (backtrace--toggle-feature): Add new argument 'all' to toggle all frames. (backtrace--set-feature): New function. (backtrace-mode): Use indent functions from Lisp modes.
-rw-r--r--lisp/emacs-lisp/backtrace.el89
1 files changed, 56 insertions, 33 deletions
diff --git a/lisp/emacs-lisp/backtrace.el b/lisp/emacs-lisp/backtrace.el
index b8969041346..d6c04bb4c67 100644
--- a/lisp/emacs-lisp/backtrace.el
+++ b/lisp/emacs-lisp/backtrace.el
@@ -349,39 +349,60 @@ Set it to VALUE unless the button is a `backtrace-ellipsis' button."
349 (button-put beg 'skip value)) 349 (button-put beg 'skip value))
350 (setq beg (next-button beg))))) 350 (setq beg (next-button beg)))))
351 351
352(defun backtrace-toggle-print-circle () 352(defun backtrace-toggle-print-circle (&optional all)
353 "Toggle `print-circle' for the backtrace frame at point." 353 "Toggle `print-circle' for the backtrace frame at point.
354 ;; TODO with argument, toggle the whole buffer. 354With prefix argument ALL, toggle the value of :print-circle in
355 (interactive) 355`backtrace-view', which affects all of the backtrace frames in
356 (backtrace--toggle-feature :print-circle)) 356the buffer."
357 357 (interactive "P")
358(defun backtrace--toggle-feature (feature) 358 (backtrace--toggle-feature :print-circle all))
359 "Toggle FEATURE for the backtrace frame at point. 359
360FEATURE should be one of the options in `backtrace-view'. 360(defun backtrace--toggle-feature (feature all)
361After toggling the feature, reprint the frame and position 361 "Toggle FEATURE for the current backtrace frame or for the buffer.
362point at the start of the section of the frame it was in 362FEATURE should be one of the options in `backtrace-view'. If ALL
363before." 363is non-nil, toggle FEATURE for all frames in the buffer. After
364 (let ((index (backtrace-get-index)) 364toggling the feature, reprint the affected frame(s). Afterwards
365 (view (copy-sequence (backtrace-get-view)))) 365position point at the start of the frame it was in before."
366 (unless index 366 (if all
367 (user-error "Not in a stack frame")) 367 (let ((index (backtrace-get-index))
368 (setq view (plist-put view feature (not (plist-get view feature)))) 368 (pos (point))
369 (let ((inhibit-read-only t) 369 (at-end (= (point) (point-max)))
370 (index (backtrace-get-index)) 370 (value (not (plist-get backtrace-view feature))))
371 (section (backtrace-get-section)) 371 (setq backtrace-view (plist-put backtrace-view feature value))
372 (min (backtrace-get-frame-start)) 372 (goto-char (point-min))
373 (max (backtrace-get-frame-end))) 373 ;; Skip the header.
374 (delete-region min max) 374 (unless (backtrace-get-index)
375 (goto-char min) 375 (goto-char (backtrace-get-frame-end)))
376 (backtrace-print-frame (nth index backtrace-frames) view) 376 (while (< (point) (point-max))
377 (add-text-properties min (point) 377 (backtrace--set-feature feature value)
378 `(backtrace-index ,index backtrace-view ,view)) 378 (goto-char (backtrace-get-frame-end)))
379 (goto-char min) 379 (if (not index)
380 (when (not (eq section (backtrace-get-section))) 380 (goto-char (if at-end (point-max) pos))
381 (if-let ((pos (text-property-any (backtrace-get-frame-start) 381 (goto-char (point-min))
382 (backtrace-get-frame-end) 382 (while (and (not (eql index (backtrace-get-index)))
383 'backtrace-section section))) 383 (< (point) (point-max)))
384 (goto-char pos)))))) 384 (goto-char (backtrace-get-frame-end)))))
385 (let ((index (backtrace-get-index)))
386 (unless index
387 (user-error "Not in a stack frame"))
388 (backtrace--set-feature feature
389 (not (plist-get (backtrace-get-view) feature))))))
390
391(defun backtrace--set-feature (feature value)
392 "Set FEATURE in the view plist of the frame at point to VALUE.
393Reprint the frame with the new view plist."
394 (let ((inhibit-read-only t)
395 (view (copy-sequence (backtrace-get-view)))
396 (index (backtrace-get-index))
397 (min (backtrace-get-frame-start))
398 (max (backtrace-get-frame-end)))
399 (setq view (plist-put view feature value))
400 (delete-region min max)
401 (goto-char min)
402 (backtrace-print-frame (nth index backtrace-frames) view)
403 (add-text-properties min (point)
404 `(backtrace-index ,index backtrace-view ,view))
405 (goto-char min)))
385 406
386(defun backtrace-expand-ellipsis (button) 407(defun backtrace-expand-ellipsis (button)
387 "Expand display of the elided form at BUTTON." 408 "Expand display of the elided form at BUTTON."
@@ -771,6 +792,8 @@ followed by `backtrace-print-frame', once for each stack frame."
771 ;; (set-buffer-multibyte t) 792 ;; (set-buffer-multibyte t)
772 (setq-local revert-buffer-function #'backtrace-revert) 793 (setq-local revert-buffer-function #'backtrace-revert)
773 (setq-local filter-buffer-substring-function #'backtrace--filter-visible) 794 (setq-local filter-buffer-substring-function #'backtrace--filter-visible)
795 (setq-local indent-line-function 'lisp-indent-line)
796 (setq-local indent-region-function 'lisp-indent-region)
774 (add-hook 'xref-backend-functions #'backtrace--xref-backend nil t)) 797 (add-hook 'xref-backend-functions #'backtrace--xref-backend nil t))
775 798
776(put 'backtrace-mode 'mode-class 'special) 799(put 'backtrace-mode 'mode-class 'special)