Subject: bug#8147: 24.0.50; Inserting *Help* buffer can lead to data loss

From: Stephen Berman <[email-masked]>
Date: Sun, 06 Mar 2011 01:24:27 +0100

On Sat, 05 Mar 2011 16:10:20 -0500 Chong Yidong <[email-masked]> wrote:

> Stefan Monnier <[email-masked]> writes:
>
>>> I reported this problem to emacs-devel in May 2008 (see
>>> http://thread.gmane.org/gmane.emacs.devel/97367/) and there were a few
>>> ideas about how to deal with it, but none were pursued.  I just got bit
>>> by it again -- more fool me, perhaps, but it gives me the opportunity to
>>> put it in the bug tracker.  And I offer a fix to the immediate problem
>>
>> Maybe another approach is for those buttons to check that the current
>> buffer is (derived-mode-p 'help-mode) before reusing it.
>
> I've committed just such a change.

I just tested this with the doc string of help-buffer in *Help*.  There
are two links in this doc string: clicking on `help-xref-following'
shows the error message "Current buffer is not in Help mode", which is
certainly better than overwriting the content of the buffer; but
clicking on `help-mode.el' finds that file and puts point on the
beginning of help-buffer's definition, i.e., still does what this kind
of link has always done.  It is confusing to have this divergence in
behavior between the two kinds of links.  Instead of signalling an
error, couldn't the help-xref-following buttons just show the help in
the *Help* buffer, as in the following patch?

*** /data/steve/bzr/emacs/trunk/lisp/help-mode.el	2011-02-23 15:11:01.000000000 +0100
--- /data/steve/bzr/emacs/quickfixes/lisp/help-mode.el	2011-03-06 01:13:36.000000000 +0100
***************
*** 408,419 ****
  ;;;###autoload
  (defun help-buffer ()
    "Return the name of a buffer for inserting help.
! If `help-xref-following' is non-nil, this is the name of the
! current buffer.
! Otherwise, it is *Help*; if no buffer with that name currently
! exists, it is created."
    (buffer-name				;for with-output-to-temp-buffer
!    (if help-xref-following
         (current-buffer)
       (get-buffer-create "*Help*"))))
  
--- 408,420 ----
  ;;;###autoload
  (defun help-buffer ()
    "Return the name of a buffer for inserting help.
! If `help-xref-following' is non-nil and the current buffer is
! derived from `help-mode', this is the name of the current buffer.
! Otherwise, return \"*Help*\", creating a buffer with that name if
! it does not already exist."
    (buffer-name				;for with-output-to-temp-buffer
!    (if (and help-xref-following
! 	    (derived-mode-p 'help-mode))
         (current-buffer)
       (get-buffer-create "*Help*"))))
  
Steve Berman