1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
;;; racket-bug-report.el -*- lexical-binding: t; -*-
;; Copyright (c) 2013-2023 by Greg Hendershott.
;; Portions Copyright (C) 1985-1986, 1999-2013 Free Software Foundation, Inc.
;; Author: Greg Hendershott
;; URL: https://github.com/greghendershott/racket-mode
;; SPDX-License-Identifier: GPL-3.0-or-later
(require 'cl-macs)
(require 'cus-edit)
(require 'package)
(require 'seq)
(require 'racket-back-end)
(require 'racket-cmd)
(require 'racket-custom)
;;;###autoload
(defun racket-bug-report ()
"Fill a buffer with details for a Racket Mode bug report."
(interactive)
(unless (string-match-p "^racket-" (symbol-name major-mode))
(user-error "Please run from a Racket Mode buffer in which you're having a problem"))
(let ((original-buffer (current-buffer))
(help-window-select t)
(print-length nil) ;for `pp'
(print-level nil)) ;for `pp'
(cl-flet* ((-section (label thunk)
(princ (format "<h2>%s</h2>\n" label))
(princ "<dl>\n")
(funcall thunk)
(princ "</dl>\n"))
(show (label value)
(princ (format "<dt>%s</dt>" label))
(princ "<dd><pre>")
(pp value)
(princ "</pre></dd>\n"))
(show-vars (syms)
(with-current-buffer original-buffer
(dolist (sym syms)
(ignore-errors (show sym (symbol-value sym))))))
(symbol-less-p (a b)
(string-lessp (symbol-name a) (symbol-name b))))
(cl-macrolet ((section (title &rest body)
`(-section ,title (lambda () ,@body))))
(with-help-window "*racket-mode bug report*"
(princ "Please copy all of the following lines and paste them into your bug report\n")
(princ "at <https://github.com/greghendershott/racket-mode/issues/>.\n\n")
(princ "<details>\n")
(section "Package"
(show "metadata"
(let ((v (assq 'racket-mode package-alist)))
(and v (cdr v))))
(show-vars '(package-archives
racket--el-source-dir
racket--rkt-source-dir)))
(section "System values"
(show-vars '(emacs-version
major-mode
system-type
x-gtk-use-system-tooltips))
(show 'display-graphic-p (display-graphic-p)))
(section "Buffer values"
(show-vars '(after-change-functions
before-change-functions
completion-at-point-functions
eldoc-documentation-function
eldoc-documentation-strategy
eldoc-documentation-functions
font-lock-defaults
pre-command-hook
post-command-hook
post-self-insert-hook
xref-backend-functions)))
(section "Racket Mode values"
(show 'racket--cmd-open-p (racket--cmd-open-p))
(show-vars
(sort
(seq-uniq
(append
(racket--bug-report-customs)
'(racket-mode-hook
racket-hash-lang-mode-hook
racket-hash-lang-module-language-hook
racket-repl-mode-hook
racket-back-end-configurations)))
#'symbol-less-p)))
(section "Minor modes"
(let* ((minor-modes (seq-uniq
(append minor-mode-list
(mapcar #'car minor-mode-alist))))
(minor-modes (sort minor-modes #'symbol-less-p))
(enabled (with-current-buffer original-buffer
(seq-filter (lambda (sym)
(when (ignore-errors (symbol-value sym))
sym))
minor-modes)))
(disabled (with-current-buffer original-buffer
(seq-filter (lambda (sym)
(unless (ignore-errors (symbol-value sym))
sym))
minor-modes))))
(show 'enabled (mapcar #'list enabled)) ;so pp line-breaks
(princ "<details><summary>Disabled minor modes</summary>\n")
(show 'disabled (mapcar #'list disabled))
(princ "</details>\n")))
(princ "</details>\n\nSteps to reproduce: "))))
(forward-line 2)))
(defun racket--bug-report-customs ()
(let ((syms nil))
(cl-labels ((item (v)
(pcase v
(`(,sym custom-variable) (push sym syms))
(`(,sym custom-group) (group sym))))
(group (sym)
(dolist (v (custom-group-members sym nil))
(item v))))
(group 'racket)
(group 'racket-xp)
(group 'racket-repl)
(group 'racket-hash-lang)
(group 'racket-other)
syms)))
(provide 'racket-bug-report)
;;; racket-bug-report.el ends here
|