From 6fc48df5ae6244485a963d138c6441c50396deed Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Tue, 15 Jun 2021 20:51:00 +0200 Subject: [PATCH] Add new convenience commands for *Help* * doc/emacs/help.texi (Help Mode): Document it (bug#36767). * lisp/help-fns.el (help-fns-function-description-header) (describe-variable, describe-face, describe-keymap) (describe-mode): Add the required data. * lisp/help-mode.el (help-mode-map): Add 'i' and 's'. (help-mode--current-data): New variable. (help-mode): Make it local. (help-view-source, help-goto-info): New commands. --- doc/emacs/help.texi | 5 +++++ etc/NEWS | 9 +++++++++ lisp/help-fns.el | 29 ++++++++++++++++++++++++----- lisp/help-mode.el | 26 +++++++++++++++++++++++++- 4 files changed, 63 insertions(+), 6 deletions(-) diff --git a/doc/emacs/help.texi b/doc/emacs/help.texi index 90a2ddc809a..8c24a926af5 100644 --- a/doc/emacs/help.texi +++ b/doc/emacs/help.texi @@ -451,6 +451,11 @@ Go forward to the next help topic (@code{help-go-forward}). @item C-c C-b @itemx l Go back to the previous help topic (@code{help-go-back}). +@item s +View the source of the current help topic (if any) +(@code{help-view-source}). +@item i +Look up the current topic in the manual(s) (@code{help-goto-info}). @end table @cindex hyperlink diff --git a/etc/NEWS b/etc/NEWS index 85ef6e4ba38..da1372baf4c 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1124,6 +1124,15 @@ This change is for better compatibility with old versions of non-GNU ** Help ++++ +*** New command 'help-view-source' ('s') +This command will view the source file (if any) of the current help +topic. + ++++ +*** New command 'help-goto-info' ('i') +This command will look up the current symbol (if any) in Info. + --- *** The 'help-for-help' ('C-h C-h') screen has been redesigned. diff --git a/lisp/help-fns.el b/lisp/help-fns.el index 133763add15..f9804c705b3 100644 --- a/lisp/help-fns.el +++ b/lisp/help-fns.el @@ -887,7 +887,9 @@ Returns a list of the form (REAL-FUNCTION DEF ALIASED REAL-DEF)." nil t) (help-xref-button 1 'help-function real-def))))) - (when file-name + (if (not file-name) + (with-current-buffer standard-output + (setq help-mode--current-data (list :symbol function))) ;; We used to add .el to the file name, ;; but that's completely wrong when the user used load-file. (princ (format-message " in `%s'" @@ -896,6 +898,8 @@ Returns a list of the form (REAL-FUNCTION DEF ALIASED REAL-DEF)." (help-fns-short-filename file-name)))) ;; Make a hyperlink to the library. (with-current-buffer standard-output + (setq help-mode--current-data (list :symbol function + :file file-name)) (save-excursion (re-search-backward (substitute-command-keys "`\\([^`']+\\)'") nil t) @@ -1070,7 +1074,10 @@ it is displayed along with the global value." "C source code" (help-fns-short-filename file-name)))) (with-current-buffer standard-output - (save-excursion + (setq help-mode--current-data + (list :symbol variable + :file file-name)) + (save-excursion (re-search-backward (substitute-command-keys "`\\([^`']+\\)'") nil t) @@ -1079,6 +1086,8 @@ it is displayed along with the global value." (if valvoid "It is void as a variable." "Its ")) + (with-current-buffer standard-output + (setq help-mode--current-data (list :symbol variable))) (if valvoid " is void as a variable." (substitute-command-keys "'s "))))) @@ -1448,7 +1457,10 @@ If FRAME is omitted or nil, use the selected frame." (concat "\\(" customize-label "\\)") nil t) (help-xref-button 1 'help-customize-face f))) (setq file-name (find-lisp-object-file-name f 'defface)) - (when file-name + (if (not file-name) + (setq help-mode--current-data (list :symbol f)) + (setq help-mode--current-data (list :symbol f + :file file-name)) (princ (substitute-command-keys "Defined in `")) (princ (help-fns-short-filename file-name)) (princ (substitute-command-keys "'")) @@ -1738,7 +1750,9 @@ keymap value." (unless used-gentemp (princ (format-message "%S is a keymap variable" keymap)) (if (not file-name) - (princ ".\n\n") + (progn + (setq help-mode--current-data (list :symbol keymap)) + (princ ".\n\n")) (princ (format-message " defined in `%s'.\n\n" (if (eq file-name 'C-source) @@ -1748,6 +1762,8 @@ keymap value." (re-search-backward (substitute-command-keys "`\\([^`']+\\)'") nil t) + (setq help-mode--current-data (list :symbol keymap + :file file-name)) (help-xref-button 1 'help-variable-def keymap file-name)))) (when (and (not (equal "" doc)) doc) @@ -1855,7 +1871,8 @@ documentation for the major and minor modes of that buffer." (princ " mode") (let* ((mode major-mode) (file-name (find-lisp-object-file-name mode nil))) - (when file-name + (if (not file-name) + (setq help-mode--current-data (list :symbol mode)) (princ (format-message " defined in `%s'" (help-fns-short-filename file-name))) ;; Make a hyperlink to the library. @@ -1863,6 +1880,8 @@ documentation for the major and minor modes of that buffer." (save-excursion (re-search-backward (substitute-command-keys "`\\([^`']+\\)'") nil t) + (setq help-mode--current-data (list :symbol mode + :file file-name)) (help-xref-button 1 'help-function-def mode file-name))))) (let ((fundoc (help-split-fundoc (documentation major-mode) nil 'doc))) (with-current-buffer standard-output diff --git a/lisp/help-mode.el b/lisp/help-mode.el index c7eaae5feb4..7450d733322 100644 --- a/lisp/help-mode.el +++ b/lisp/help-mode.el @@ -44,6 +44,8 @@ (define-key map [XF86Forward] 'help-go-forward) (define-key map "\C-c\C-c" 'help-follow-symbol) (define-key map "\r" 'help-follow) + (define-key map "s" 'help-view-source) + (define-key map "i" 'help-goto-info) map) "Keymap for Help mode.") @@ -61,7 +63,11 @@ ["Move to Previous Button" backward-button :help "Move to the Previous Button in the help buffer"] ["Move to Next Button" forward-button - :help "Move to the Next Button in the help buffer"])) + :help "Move to the Next Button in the help buffer"] + ["View Source" help-view-source + :help "Go to the source file for the current help item"] + ["Goto Info" help-goto-info + :help "Go to the info node for the current help item"])) (defvar help-mode-tool-bar-map (let ((map (make-sparse-keymap))) @@ -323,6 +329,7 @@ The format is (FUNCTION ARGS...).") 'help-echo (purecopy "mouse-2, RET: show corresponding NEWS announcement")) (defvar bookmark-make-record-function) +(defvar help-mode--current-data nil) ;;;###autoload (define-derived-mode help-mode special-mode "Help" @@ -334,6 +341,7 @@ Commands: #'help-mode-revert-buffer) (setq-local tool-bar-map help-mode-tool-bar-map) + (setq-local help-mode--current-data nil) (setq-local bookmark-make-record-function #'help-bookmark-make-record)) @@ -722,6 +730,22 @@ See `help-make-xrefs'." (help-xref-go-forward (current-buffer)) (user-error "No next help buffer"))) +(defun help-view-source () + "View the source of the current help item." + (interactive nil help-mode) + (unless help-mode--current-data + (error "Source file for the current help item is not defined")) + (help-function-def--button-function (plist-get help-mode--current-data :symbol) + (plist-get help-mode--current-data :file))) + +(defun help-goto-info () + "View the *info* node of the current help item." + (interactive nil help-mode) + (unless help-mode--current-data + (error "No symbol to look up in the current buffer")) + (info-lookup-symbol (plist-get help-mode--current-data :symbol) + 'emacs-lisp-mode)) + (defun help-do-xref (_pos function args) "Call the help cross-reference function FUNCTION with args ARGS. Things are set up properly so that the resulting help-buffer has -- 2.39.5