From: "Basil L. Contovounesios" <contovob@tcd.ie>
To: Stefan Kangas <stefan@marxist.se>
Cc: 36588@debbugs.gnu.org
Subject: bug#36588: Unable to revert M-x apropos help buffer
Date: Thu, 11 Jul 2019 15:53:56 +0100 [thread overview]
Message-ID: <87h87sk4fv.fsf@tcd.ie> (raw)
In-Reply-To: <CADwFkmkthgh4fELBiNHxYHJKuDZwRFcXeLwh_wybDUxRuKu-DA@mail.gmail.com> (Stefan Kangas's message of "Thu, 11 Jul 2019 05:31:59 +0200")
[-- Attachment #1: Type: text/plain, Size: 1856 bytes --]
severity 36588 minor
tags 36588 + patch
quit
Stefan Kangas <stefan@marxist.se> writes:
> I get an error trying to revert the apropos help buffer on Emacs 27
> (current master). I could also reproduce this on 26.1.
>
> Steps to reproduce:
> 0. emacs -Q
> 1. M-x apropos RET foo RET
> 2. C-x o
> 3. g yes RET
> 4. Error:
> apply: Symbol’s function definition is void: nil
>
> Backtrace:
> Debugger entered--Lisp error: (void-function nil)
> nil()
> apply(nil nil)
> help-mode-revert-buffer(t nil)
> revert-buffer(t)
> funcall-interactively(revert-buffer t)
> #<subr call-interactively>(revert-buffer nil nil)
> apply(#<subr call-interactively> revert-buffer (nil nil))
> call-interactively@ido-cr+-record-current-command(#<subr
> call-interactively> revert-buffer nil nil)
> apply(call-interactively@ido-cr+-record-current-command #<subr
> call-interactively> (revert-buffer nil nil))
> call-interactively(revert-buffer nil nil)
> command-execute(revert-buffer)
This is because Apropos buffers are set up in apropos-print using
with-output-to-temp-buffer, which by default calls help-mode, which sets
revert-buffer-function permanently-locally to help-mode-revert-buffer.
[Aside: Why is revert-buffer-function permanent-local?]
help-mode-revert-buffer expects the command which generated the Help
buffer to have previously called help-setup-xref. This should be
possible to do in Apropos, but it would be quite ugly as help-setup-xref
needs to be called with the Help buffer current, so Apropos commands
would need to set their own version of help-xref-stack-item before
apropos-print performs the help-setup-xref dance. Besides, Apropos
buffers are not (currently) really Help buffers.
Instead, I propose emulating a simpler version of help-setup-xref
specific to Apropos:
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Support-reverting-Apropos-buffers-bug-36588.patch --]
[-- Type: text/x-diff, Size: 4253 bytes --]
From 890d2d6c1447f207892be734ab7412b4b471ddb7 Mon Sep 17 00:00:00 2001
From: "Basil L. Contovounesios" <contovob@tcd.ie>
Date: Thu, 11 Jul 2019 15:11:35 +0100
Subject: [PATCH] Support reverting Apropos buffers (bug#36588)
* lisp/apropos.el (apropos--current): New variable akin to
help-xref-stack-item storing information for revert-buffer.
(apropos--revert-buffer): New function.
(apropos-mode): Use it as revert-buffer-function.
(apropos-command, apropos, apropos-library, apropos-value)
(apropos-local-value, apropos-documentation): Set apropos--current
in low-level commands, i.e., those which do not call other commands.
---
lisp/apropos.el | 22 +++++++++++++++++++++-
1 file changed, 21 insertions(+), 1 deletion(-)
diff --git a/lisp/apropos.el b/lisp/apropos.el
index 1b86f5bcde..79e5a1518f 100644
--- a/lisp/apropos.el
+++ b/lisp/apropos.el
@@ -212,6 +212,12 @@ apropos-synonyms
Each element is a list of words where the first word is the standard Emacs
term, and the rest of the words are alternative terms.")
+(defvar apropos--current nil
+ "List of current Apropos function followed by its arguments.
+Used by `apropos--revert-buffer' to regenerate the current
+Apropos buffer. Each Apropos command should ensure it is set
+before `apropos-mode' makes it buffer-local.")
+
\f
;;; Button types used by apropos
@@ -472,10 +478,18 @@ apropos-true-hit-doc
"Return t if DOC is really matched by the current keywords."
(apropos-true-hit doc apropos-all-words))
+(defun apropos--revert-buffer (_ignore-auto noconfirm)
+ "Regenerate current Apropos buffer using `apropos--current'.
+Intended as a value for `revert-buffer-function'."
+ (when (or noconfirm (yes-or-no-p "Revert apropos buffer? "))
+ (apply #'funcall apropos--current)))
+
(define-derived-mode apropos-mode special-mode "Apropos"
"Major mode for following hyperlinks in output of apropos commands.
-\\{apropos-mode-map}")
+\\{apropos-mode-map}"
+ (make-local-variable 'apropos--current)
+ (setq-local revert-buffer-function #'apropos--revert-buffer))
(defvar apropos-multi-type t
"If non-nil, this apropos query concerns multiple types.
@@ -550,6 +564,7 @@ apropos-command
(if (or current-prefix-arg apropos-do-all)
"command or function" "command"))
current-prefix-arg))
+ (setq apropos--current (list #'apropos-command pattern do-all var-predicate))
(apropos-parse-pattern pattern)
(let ((message
(let ((standard-output (get-buffer-create "*Apropos*")))
@@ -628,6 +643,7 @@ apropos
Returns list of symbols and documentation found."
(interactive (list (apropos-read-pattern "symbol")
current-prefix-arg))
+ (setq apropos--current (list #'apropos pattern do-all))
(apropos-parse-pattern pattern)
(apropos-symbols-internal
(apropos-internal apropos-regexp
@@ -670,6 +686,7 @@ apropos-library
libs))
libs)))
(list (completing-read "Describe library: " libs nil t))))
+ (setq apropos--current (list #'apropos-library file))
(let ((symbols nil)
;; (autoloads nil)
(provides nil)
@@ -776,6 +793,7 @@ apropos-value
Returns list of symbols and values found."
(interactive (list (apropos-read-pattern "value")
current-prefix-arg))
+ (setq apropos--current (list #'apropos-value pattern do-all))
(apropos-parse-pattern pattern)
(or do-all (setq do-all apropos-do-all))
(setq apropos-accumulator ())
@@ -815,6 +833,7 @@ apropos-local-value
Optional arg BUFFER (default: current buffer) is the buffer to check."
(interactive (list (apropos-read-pattern "value of buffer-local variable")))
(unless buffer (setq buffer (current-buffer)))
+ (setq apropos--current (list #'apropos-local-value pattern buffer))
(apropos-parse-pattern pattern)
(setq apropos-accumulator ())
(let ((var nil))
@@ -856,6 +875,7 @@ apropos-documentation
;; output, but I cannot see that that is true.
(interactive (list (apropos-read-pattern "documentation")
current-prefix-arg))
+ (setq apropos--current (list #'apropos-documentation pattern do-all))
(apropos-parse-pattern pattern)
(or do-all (setq do-all apropos-do-all))
(setq apropos-accumulator () apropos-files-scanned ())
--
2.20.1
[-- Attachment #3: Type: text/plain, Size: 284 bytes --]
I don't consider this duplication because, unless Apropos were
completely refactored, setting something like apropos--current would be
necessary either way. This has the added perk of not coupling Apropos
with Help any more than it currently needs to be.
WDYT?
Thanks,
--
Basil
next prev parent reply other threads:[~2019-07-11 14:53 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-07-11 3:31 bug#36588: Unable to revert M-x apropos help buffer Stefan Kangas
2019-07-11 14:53 ` Basil L. Contovounesios [this message]
2019-07-12 5:03 ` Stefan Kangas
2019-08-04 22:45 ` Basil L. Contovounesios
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87h87sk4fv.fsf@tcd.ie \
--to=contovob@tcd.ie \
--cc=36588@debbugs.gnu.org \
--cc=stefan@marxist.se \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).