# HG changeset patch # User Richard M. Stallman # Date 788204001 0 # Node ID 31d062ac1d2f7d4086133b3a7509ef4c1fceb801 # Parent 1817c533231668165b4a5ae9b4b55942e03ff435 (reporter-submit-bug-report): Set up for status messages. Use mail-text to position point to the body of the message. (reporter-beautify-list): Complete rewrite. Optional nocompact-p argument. (reporter-dump-variable): Invert the test and passing of compact-p argument to reporter-beautify-list. List values are not printed as defuns or function calls. Updated package list. (reporter-lisp-indent): New defun. (reporter-dont-compact-list) (reporter-status-message, reporter-status-count): New variables. (reporter-update-status, reporter-beautify-list) reporter-dump-variable): Now smarter about formating variables with list values. Checks the value of reporter-dont-compact-list. diff -r 1817c5332316 -r 31d062ac1d2f lisp/mail/reporter.el --- a/lisp/mail/reporter.el Fri Dec 23 17:25:50 1994 +0000 +++ b/lisp/mail/reporter.el Fri Dec 23 17:33:21 1994 +0000 @@ -1,10 +1,10 @@ ;;; reporter.el --- customizable bug reporting of lisp programs -;; Author: 1993 Barry A. Warsaw, Century Computing Inc. -;; Maintainer: bwarsaw@cen.com +;; Author: 1993 Barry A. Warsaw +;; Maintainer: bwarsaw@cnri.reston.va.us ;; Created: 19-Apr-1993 -;; Version: 2.12 -;; Last Modified: 1994/07/06 14:55:39 +;; Version: 2.21 +;; Last Modified: 1994/11/29 16:13:50 ;; Keywords: bug reports lisp ;; Copyright (C) 1993 1994 Barry A. Warsaw @@ -35,9 +35,9 @@ ;; set up a mail buffer with the appropriate bug report address, ;; including a lisp expression the maintainer of the package can eval ;; to completely reproduce the environment in which the bug was -;; observed (e.g. by using eval-last-sexp). This package proved especially -;; useful during my development of cc-mode.el, which is highly dependent -;; on its configuration variables. +;; observed (e.g. by using eval-last-sexp). This package proved +;; especially useful during my development of cc-mode.el, which is +;; highly dependent on its configuration variables. ;; ;; Do a "C-h f reporter-submit-bug-report" for more information. ;; Here's an example usage: @@ -56,13 +56,6 @@ ;; ;; ... ;; 'mypkg-variable-last))) -;; Major differences since version 1: -;; ================================== -;; * More robust in the face of void variables -;; * New interface controlling variable reporter-prompt-for-summary-p -;; * pretty-printing of lists! - - ;; Mailing List ;; ============ ;; I've set up a mailing list to report bugs or suggest enhancements, @@ -73,10 +66,14 @@ ;; Administrivia: reporter-request@anthem.nlm.nih.gov ;; Submissions: reporter@anthem.nlm.nih.gov +;; Packages that currently use reporter are: cc-mode, supercite, elp, +;; tcl, ediff, crypt, vm, edebug, archie, and efs. If you know of +;; others, please email me! + ;; LCD Archive Entry: -;; reporter|Barry A. Warsaw|bwarsaw@cen.com| +;; reporter|Barry A. Warsaw|bwarsaw@cnri.reston.va.us| ;; Customizable bug reporting of lisp programs.| -;; 1994/07/06 14:55:39|2.12|~/misc/reporter.el.Z| +;; 1994/11/29 16:13:50|2.21|~/misc/reporter.el.Z| ;;; Code: @@ -88,7 +85,9 @@ "*Mail package to use to generate bug report buffer. This can either be a function symbol or a list of function symbols. If a list, it tries to use each specified mailer in order until an -existing one is found.") +existing one is found. + +MH-E users may want to use `mh-smail'.") (defvar reporter-prompt-for-summary-p nil "Interface variable controlling prompting for problem summary. @@ -101,6 +100,18 @@ `reporter-submit-bug-report'. Note that this variable is not buffer-local so you should never just `setq' it.") +(defvar reporter-dont-compact-list nil + "Interface variable controlling compating of list values. +When non-nil, this must be a list of variable symbols. When a +variable containing a list value is formatted in the bug report mail +buffer, it normally is compacted so that its value fits one the fewest +number of lines. If the variable's symbol appears in this list, its +value is printed in a more verbose style, specifically, one elemental +sexp per line. + +Note that this variable is not buffer-local so you should never just +`setq' it. If you want to changes its default value, you should `let' +bind it.") ;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;; end of user defined variables @@ -111,24 +122,74 @@ variables. Current buffer will always be the mail buffer being composed.") -(defconst reporter-version "2.12" +(defconst reporter-version "2.21" "Reporter version number.") (defvar reporter-initial-text nil "The automatically created initial text of a bug report.") (make-variable-buffer-local 'reporter-initial-text) + +(defvar reporter-status-message nil) +(defvar reporter-status-count nil) + +(defun reporter-update-status () + ;; periodically output a status message + (if (zerop (% reporter-status-count 10)) + (progn + (message reporter-status-message) + (setq reporter-status-message (concat reporter-status-message ".")))) + (setq reporter-status-count (1+ reporter-status-count))) +(defun reporter-beautify-list (maxwidth compact-p) + ;; pretty print a list + (reporter-update-status) + (let (linebreak indent-enclosing-p indent-p here) + (condition-case nil ;loop exit + (progn + (down-list 1) + (setq indent-enclosing-p t) + (while t + (setq here (point)) + (forward-sexp 1) + (if (<= maxwidth (current-column)) + (if linebreak + (progn + (goto-char linebreak) + (newline-and-indent) + (setq linebreak nil)) + (goto-char here) + (setq indent-p (reporter-beautify-list maxwidth compact-p)) + (goto-char here) + (forward-sexp 1) + (if indent-p + (newline-and-indent)) + t) + (if compact-p + (setq linebreak (point)) + (newline-and-indent)) + )) + t) + (error indent-enclosing-p)))) + +(defun reporter-lisp-indent (indent-point state) + ;; a better lisp indentation style for bug reporting + (save-excursion + (goto-char (1+ (nth 1 state))) + (current-column))) + (defun reporter-dump-variable (varsym mailbuf) ;; Pretty-print the value of the variable in symbol VARSYM. MAILBUF ;; is the mail buffer being composed + (reporter-update-status) (condition-case nil (let ((val (save-excursion (set-buffer reporter-eval-buffer) (symbol-value varsym))) (sym (symbol-name varsym)) (print-escape-newlines t) + (maxwidth (1- (window-width))) (here (point))) (insert " " sym " " (cond @@ -137,36 +198,17 @@ ((symbolp val) "'") (t "")) (prin1-to-string val)) + (lisp-indent-line) ;; clean up lists, but only if the line as printed was long ;; enough to wrap - (if (and (listp val) - (< (window-width) (current-column))) + (if (and val ;nil is a list, but short + (listp val) + (<= maxwidth (current-column))) (save-excursion - (goto-char here) - ;; skip past the symbol name - (down-list 1) - (condition-case nil ; actual loop exit - (while t - (forward-sexp 1) - (insert "\n") - ;; if the sexp is longer than a single line then - ;; fill it to fill-column - (if (< (window-width) - (save-excursion - (forward-char -1) - (current-column))) - (let (stop) - (unwind-protect - (setq stop (point-marker)) - (forward-line -1) - (fill-region (point) (progn (end-of-line) - (point))) - ;; consume extra newline left by fill-region - (delete-char 1) - (goto-char stop)) - (set-marker stop nil))) - (lisp-indent-line)) - (error nil)))) + (let ((compact-p (not (memq varsym reporter-dont-compact-list))) + (lisp-indent-function 'reporter-lisp-indent)) + (goto-char here) + (reporter-beautify-list maxwidth compact-p)))) (insert "\n")) (void-variable (save-excursion @@ -230,9 +272,8 @@ (funcall printer varsym mailbuf) ))) varlist) - (insert ")\n") - (beginning-of-defun) - (indent-sexp)) + (lisp-indent-line) + (insert ")\n")) (insert-buffer elbuf)) (error (insert "State could not be dumped due to the following error:\n\n" @@ -279,6 +320,8 @@ (let ((reporter-eval-buffer (current-buffer)) final-resting-place after-sep-pos + (reporter-status-message "Formatting bug report buffer...") + (reporter-status-count 0) (problem (and reporter-prompt-for-summary-p (read-string "(Very) brief summary of problem: "))) (mailbuf @@ -313,7 +356,8 @@ (progn (mail-position-on-field "subject") (insert pkgname "; " problem))) - (re-search-forward mail-header-separator (point-max) 'move) + ;; move point to the body of the message + (mail-text) (forward-line 1) (setq after-sep-pos (point)) (and salutation (insert "\n" salutation "\n\n"))