(vm-visit-folder): Declare as a function.
[bpt/emacs.git] / lisp / mail / emacsbug.el
CommitLineData
55535639 1;;; emacsbug.el --- command to report Emacs bugs to appropriate mailing list
c0274f38 2
e84b4b86 3;; Copyright (C) 1985, 1994, 1997, 1998, 2000, 2001, 2002, 2003,
d7a0267c 4;; 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
9750e079 5
e5167999 6;; Author: K. Shane Hartman
2f14b48d 7;; Maintainer: FSF
fbd410d6 8;; Keywords: maint mail
2f14b48d 9
a2535589 10;; Not fully installed because it can work only on Internet hosts.
a2535589
JA
11;; This file is part of GNU Emacs.
12
13;; GNU Emacs is free software; you can redistribute it and/or modify
14;; it under the terms of the GNU General Public License as published by
ceaeecb0 15;; the Free Software Foundation; either version 3, or (at your option)
a2535589
JA
16;; any later version.
17
18;; GNU Emacs is distributed in the hope that it will be useful,
19;; but WITHOUT ANY WARRANTY; without even the implied warranty of
20;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21;; GNU General Public License for more details.
22
23;; You should have received a copy of the GNU General Public License
b578f267 24;; along with GNU Emacs; see the file COPYING. If not, write to the
3a35cf56
LK
25;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
26;; Boston, MA 02110-1301, USA.
a2535589 27
e41b2db1
ER
28;;; Commentary:
29
b92a07e0 30;; `M-x report-emacs-bug' starts an email note to the Emacs maintainers
e41b2db1
ER
31;; describing a problem. Here's how it's done...
32
2f14b48d 33;;; Code:
a2535589
JA
34
35;; >> This should be an address which is accessible to your machine,
36;; >> otherwise you can't use this file. It will only work on the
37;; >> internet with this address.
38
f9f9cd92
KH
39(require 'sendmail)
40
fbd410d6
RS
41(defgroup emacsbug nil
42 "Sending Emacs bug reports."
43 :group 'maint
44 :group 'mail)
45
9b4e41ac 46(defcustom report-emacs-bug-address "bug-gnu-emacs@gnu.org"
7b27eb53
RS
47 "*Address of mailing list for GNU Emacs bugs."
48 :group 'emacsbug
49 :type 'string)
a85a468e 50
9b4e41ac 51(defcustom report-emacs-bug-pretest-address "emacs-pretest-bug@gnu.org"
7b27eb53
RS
52 "*Address of mailing list for GNU Emacs pretest bugs."
53 :group 'emacsbug
54 :type 'string)
a2535589 55
e24ec555
RS
56(defvar report-emacs-bug-orig-text nil
57 "The automatically-created initial text of bug report.")
58
fbd410d6
RS
59(defcustom report-emacs-bug-no-confirmation nil
60 "*If non-nil, suppress the confirmations asked for the sake of novice users."
61 :group 'emacsbug
62 :type 'boolean)
63
64(defcustom report-emacs-bug-no-explanations nil
65 "*If non-nil, suppress the explanations given for the sake of novice users."
66 :group 'emacsbug
67 :type 'boolean)
fe1d8b33 68
aa228418 69;;;###autoload
01753e63 70(defun report-emacs-bug (topic &optional recent-keys)
aa228418 71 "Report a bug in GNU Emacs.
a2535589 72Prompts for bug subject. Leaves you in a mail buffer."
01753e63
EN
73 ;; This strange form ensures that (recent-keys) is the value before
74 ;; the bug subject string is read.
75 (interactive (reverse (list (recent-keys) (read-string "Bug Subject: "))))
a722966c
MC
76 ;; The syntax `version;' is preferred to `[version]' because the
77 ;; latter could be mistakenly stripped by mailing software.
ef77dde4
MC
78 (if (eq system-type 'ms-dos)
79 (setq topic (concat emacs-version "; " topic))
80 (when (string-match "^\\(\\([.0-9]+\\)*\\)\\.[0-9]+$" emacs-version)
81 (setq topic (concat (match-string 1 emacs-version) "; " topic))))
82 ;; If there are four numbers in emacs-version (three for MS-DOS),
83 ;; this is a pretest version.
84 (let* ((pretest-p (string-match (if (eq system-type 'ms-dos)
85 "\\..*\\."
86 "\\..*\\..*\\.")
87 emacs-version))
a722966c
MC
88 (from-buffer (current-buffer))
89 (reporting-address (if pretest-p
90 report-emacs-bug-pretest-address
91 report-emacs-bug-address))
92 ;; Put these properties on semantically-void text.
93 (prompt-properties '(field emacsbug-prompt
94 intangible but-helpful
95 rear-nonsticky t))
96 user-point message-end-point)
0a18209b 97 (setq message-end-point
5e11c425 98 (with-current-buffer (get-buffer-create "*Messages*")
0a18209b 99 (point-max-marker)))
53dab082 100 (compose-mail reporting-address
0a18209b
KH
101 topic)
102 ;; The rest of this does not execute
103 ;; if the user was asked to confirm and said no.
9e68869b
RS
104 (rfc822-goto-eoh)
105 (forward-line 1)
106
107 (let ((signature (buffer-substring (point) (point-max))))
9e68869b 108 (delete-region (point) (point-max))
518adca2
RS
109 (insert signature)
110 (backward-char (length signature)))
fbd410d6
RS
111 (unless report-emacs-bug-no-explanations
112 ;; Insert warnings for novice users.
53dab082
EZ
113 (when (string-match "@gnu\\.org^" reporting-address)
114 (insert "This bug report will be sent to the Free Software Foundation,\n")
115 (let ((pos (point)))
116 (insert "not to your local site managers!")
117 (put-text-property pos (point) 'face 'highlight)))
a722966c 118 (insert "\nPlease write in ")
fbd410d6
RS
119 (let ((pos (point)))
120 (insert "English")
121 (put-text-property pos (point) 'face 'highlight))
9210027b
RS
122 (insert " if possible, because the Emacs maintainers
123usually do not have translators to read other languages for them.\n\n")
8ab5d35a 124 (insert (format "Your bug report will be posted to the %s mailing list"
53dab082 125 reporting-address))
8ab5d35a
EZ
126 (if pretest-p
127 (insert ".\n\n")
128 (insert ",\nand to the gnu.emacs.bug news group.\n\n")))
fe1d8b33 129
515ced27 130 (insert "Please describe exactly what actions triggered the bug\n"
9888f112
TTN
131 "and the precise symptoms of the bug:\n\n")
132 (add-text-properties (point) (save-excursion (mail-text) (point))
133 prompt-properties)
515ced27 134
515ced27 135 (setq user-point (point))
3a7f4c18
KS
136 (insert "\n\n")
137
fca615d5 138 (insert "If Emacs crashed, and you have the Emacs process in the gdb debugger,\n"
3a7f4c18
KS
139 "please include the output from the following gdb commands:\n"
140 " `bt full' and `xbacktrace'.\n")
141
142 (let ((debug-file (expand-file-name "DEBUG" data-directory)))
143 (if (file-readable-p debug-file)
a722966c
MC
144 (insert "If you would like to further debug the crash, please read the file\n"
145 debug-file " for instructions.\n")))
9888f112 146 (add-text-properties (1+ user-point) (point) prompt-properties)
515ced27 147
3a7f4c18 148 (insert "\n\nIn " (emacs-version) "\n")
f4982064 149 (if (fboundp 'x-server-vendor)
6f8a2742 150 (condition-case nil
951c155f
SM
151 ;; This is used not only for X11 but also W32 and others.
152 (insert "Windowing system distributor `" (x-server-vendor)
153 "', version "
6f8a2742
JD
154 (mapconcat 'number-to-string (x-server-version) ".") "\n")
155 (error t)))
0a18209b
KH
156 (if (and system-configuration-options
157 (not (equal system-configuration-options "")))
158 (insert "configured using `configure "
515ced27 159 system-configuration-options "'\n\n"))
dc81f8a2 160 (insert "Important settings:\n")
1daad47d 161 (mapc
249dd409
EZ
162 '(lambda (var)
163 (insert (format " value of $%s: %s\n" var (getenv var))))
164 '("LC_ALL" "LC_COLLATE" "LC_CTYPE" "LC_MESSAGES"
165 "LC_MONETARY" "LC_NUMERIC" "LC_TIME" "LANG"))
dc81f8a2
EZ
166 (insert (format " locale-coding-system: %s\n" locale-coding-system))
167 (insert (format " default-enable-multibyte-characters: %s\n"
168 default-enable-multibyte-characters))
0a18209b 169 (insert "\n")
3c3ba27b
RS
170 (insert (format "Major mode: %s\n"
171 (buffer-local-value 'mode-name from-buffer)))
e927088b
RS
172 (insert "\n")
173 (insert "Minor modes in effect:\n")
174 (dolist (mode minor-mode-list)
3c3ba27b
RS
175 (and (boundp mode) (buffer-local-value mode from-buffer)
176 (insert (format " %s: %s\n" mode
177 (buffer-local-value mode from-buffer)))))
e927088b 178 (insert "\n")
515ced27 179 (insert "Recent input:\n")
0a18209b
KH
180 (let ((before-keys (point)))
181 (insert (mapconcat (lambda (key)
182 (if (or (integerp key)
183 (symbolp key)
184 (listp key))
185 (single-key-description key)
186 (prin1-to-string key nil)))
187 (or recent-keys (recent-keys))
188 " "))
189 (save-restriction
190 (narrow-to-region before-keys (point))
191 (goto-char before-keys)
192 (while (progn (move-to-column 50) (not (eobp)))
193 (search-forward " " nil t)
194 (insert "\n"))))
195 (let ((message-buf (get-buffer "*Messages*")))
196 (if message-buf
197 (let (beg-pos
198 (end-pos message-end-point))
199 (with-current-buffer message-buf
200 (goto-char end-pos)
201 (forward-line -10)
202 (setq beg-pos (point)))
203 (insert "\n\nRecent messages:\n")
204 (insert-buffer-substring message-buf beg-pos end-pos))))
205 ;; This is so the user has to type something
206 ;; in order to send easily.
207 (use-local-map (nconc (make-sparse-keymap) (current-local-map)))
208 (define-key (current-local-map) "\C-c\C-i" 'report-emacs-bug-info)
e9227982
RS
209 (unless report-emacs-bug-no-explanations
210 (with-output-to-temp-buffer "*Bug Help*"
211 (if (eq mail-user-agent 'sendmail-user-agent)
212 (princ (substitute-command-keys
213 "Type \\[mail-send-and-exit] to send the bug report.\n")))
214 (princ (substitute-command-keys
215 "Type \\[kill-buffer] RET to cancel (don't send it).\n"))
216 (terpri)
217 (princ (substitute-command-keys
218 "Type \\[report-emacs-bug-info] to visit in Info the Emacs Manual section
1628adc6
KH
219about when and how to write a bug report,
220and what information to supply so that the bug can be fixed.
e9227982 221Type SPC to scroll through this section and its subsections."))))
0a18209b
KH
222 ;; Make it less likely people will send empty messages.
223 (make-local-variable 'mail-send-hook)
224 (add-hook 'mail-send-hook 'report-emacs-bug-hook)
0a18209b
KH
225 (save-excursion
226 (goto-char (point-max))
227 (skip-chars-backward " \t\n")
228 (make-local-variable 'report-emacs-bug-orig-text)
229 (setq report-emacs-bug-orig-text (buffer-substring (point-min) (point))))
230 (goto-char user-point)))
e24ec555 231
e8ffb999
DN
232(declare-function Info-menu "../info" (menu-item &optional fork))
233(declare-function Info-goto-node "../info" (nodename &optional fork))
6d00e226 234
1628adc6
KH
235(defun report-emacs-bug-info ()
236 "Go to the Info node on reporting Emacs bugs."
237 (interactive)
238 (info)
239 (Info-directory)
240 (Info-menu "emacs")
241 (Info-goto-node "Bugs"))
242
e24ec555
RS
243(defun report-emacs-bug-hook ()
244 (save-excursion
c7127655
MR
245 (save-excursion
246 (goto-char (point-max))
247 (skip-chars-backward " \t\n")
248 (if (and (= (- (point) (point-min))
249 (length report-emacs-bug-orig-text))
250 (equal (buffer-substring (point-min) (point))
251 report-emacs-bug-orig-text))
252 (error "No text entered in bug report")))
fe1d8b33
KH
253
254 ;; Check the buffer contents and reject non-English letters.
9b4e41ac
RS
255 (save-excursion
256 (goto-char (point-min))
257 (skip-chars-forward "\0-\177")
258 (if (not (eobp))
fbd410d6 259 (if (or report-emacs-bug-no-confirmation
02f6b354 260 (y-or-n-p "Convert non-ASCII letters to hexadecimal? "))
9b4e41ac
RS
261 (while (progn (skip-chars-forward "\0-\177")
262 (not (eobp)))
263 (let ((ch (following-char)))
264 (delete-char 1)
22ad9937 265 (insert (format "=%02x" ch)))))))
fe1d8b33
KH
266
267 ;; The last warning for novice users.
fbd410d6 268 (if (or report-emacs-bug-no-confirmation
fe1d8b33 269 (yes-or-no-p
02f6b354 270 "Send this bug report to the Emacs maintainers? "))
fe1d8b33
KH
271 ;; Just send the current mail.
272 nil
273 (goto-char (point-min))
274 (if (search-forward "To: ")
275 (let ((pos (point)))
276 (end-of-line)
277 (delete-region pos (point))))
278 (kill-local-variable 'mail-send-hook)
279 (with-output-to-temp-buffer "*Bug Help*"
280 (princ (substitute-command-keys "\
02f6b354
RS
281You invoked the command M-x report-emacs-bug,
282but you decided not to mail the bug report to the Emacs maintainers.
fe1d8b33 283
02f6b354
RS
284If you want to mail it to someone else instead,
285please insert the proper e-mail address after \"To: \",
286and send the mail again using \\[mail-send-and-exit].")))
287 (error "M-x report-emacs-bug was cancelled, please read *Bug Help* buffer"))
ea33ba73
TTN
288
289 ;; Unclutter
290 (mail-text)
9888f112
TTN
291 (let ((pos (1- (point))))
292 (while (setq pos (text-property-any pos (point-max)
293 'field 'emacsbug-prompt))
294 (delete-region pos (field-end (1+ pos)))))))
a2535589 295
8e0ff8c8
ER
296(provide 'emacsbug)
297
951c155f 298;; arch-tag: 248b6523-c3b5-4fec-9a3f-0411fafa7d49
c0274f38 299;;; emacsbug.el ends here