1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-12-04 08:47:11 +00:00

Add new help command describe-keymap

* lisp/help-fns.el (describe-keymap): New command to show key bindings
for a given keymap.  (Bug#30660)
* doc/emacs/help.texi (Misc Help): Document the new command.
* doc/lispref/keymaps.texi (Scanning Keymaps): Add a cross-reference
to the above documentation.
* etc/NEWS: Announce the new command.

* test/lisp/help-fns-tests.el (help-fns-test-describe-keymap/symbol)
(help-fns-test-describe-keymap/value)
(help-fns-test-describe-keymap/not-keymap)
(help-fns-test-describe-keymap/let-bound)
(help-fns-test-describe-keymap/dynamically-bound-no-file): New tests.

Co-authored-by: Drew Adams <drew.adams@oracle.com>
This commit is contained in:
Stefan Kangas 2019-08-24 01:02:04 +02:00
parent f9504ffba2
commit 557b790e0a
5 changed files with 102 additions and 2 deletions

View File

@ -601,6 +601,11 @@ is @key{ESC}, because @kbd{@key{ESC} C-h} is actually @kbd{C-M-h},
which marks a defun. However, @w{@kbd{@key{ESC} @key{F1}}} and
@w{@kbd{@key{ESC} ?}} work fine.)
@findex describe-keymap
Finally, @kbd{M-x describe-keymap} prompts for the name of a keymap,
with completion, and displays a listing of all key bindings in that
keymap.
@node Help Files
@section Help Files

View File

@ -1846,8 +1846,11 @@ local map.
@cindex scanning keymaps
@cindex keymaps, scanning
This section describes functions used to scan all the current keymaps
for the sake of printing help information.
This section describes functions used to scan all the current
keymaps for the sake of printing help information. To display the
bindings in a particular keymap, you can use the
@code{describe-keymap} command (@pxref{Misc Help, , Other Help
Commands, emacs, The GNU Emacs Manual})
@defun accessible-keymaps keymap &optional prefix
This function returns a list of all the keymaps that can be reached (via

View File

@ -85,6 +85,11 @@ shows equivalent key bindings for all commands that have them.
* Changes in Specialized Modes and Packages in Emacs 28.1
** Help
+++
*** New command 'describe-keymap' describes keybindings in a keymap.
---
** The old non-SMIE indentation of 'sh-mode' has been removed.

View File

@ -1562,6 +1562,65 @@ BUFFER should be a buffer or a buffer name."
(insert "\nThe parent category table is:")
(describe-vector table 'help-describe-category-set))))))
;;;###autoload
(defun describe-keymap (keymap)
"Describe key bindings in KEYMAP.
When called interactively, prompt for a variable that has a
keymap value."
(interactive (list
(intern (completing-read "Keymap: " obarray
(lambda (m)
(and (boundp m)
(keymapp (symbol-value m))))
t nil 'variable-name-history))))
(let (used-gentemp)
(unless (and (symbolp keymap)
(boundp keymap)
(keymapp (symbol-value keymap)))
(when (not (keymapp keymap))
(if (symbolp keymap)
(error "Not a keymap variable: %S" keymap)
(error "Not a keymap")))
(let ((sym nil))
(unless sym
(setq sym (cl-gentemp "KEYMAP OBJECT (no variable) "))
(setq used-gentemp t)
(set sym keymap))
(setq keymap sym)))
;; Follow aliasing.
(setq keymap (or (ignore-errors (indirect-variable keymap)) keymap))
(help-setup-xref (list #'describe-keymap keymap)
(called-interactively-p 'interactive))
(let* ((name (symbol-name keymap))
(doc (documentation-property keymap 'variable-documentation))
(file-name (find-lisp-object-file-name keymap 'defvar)))
(with-help-window (help-buffer)
(with-current-buffer standard-output
(unless used-gentemp
(princ (format-message "%S is a keymap variable" keymap))
(if (not file-name)
(princ ".\n\n")
(princ (format-message
" defined in `%s'.\n\n"
(if (eq file-name 'C-source)
"C source code"
(file-name-nondirectory file-name))))
(save-excursion
(re-search-backward (substitute-command-keys
"`\\([^`']+\\)'")
nil t)
(help-xref-button 1 'help-variable-def
keymap file-name))))
(when (and (not (equal "" doc)) doc)
(princ "Documentation:\n")
(princ (format-message "%s\n\n" doc)))
;; Use `insert' instead of `princ', so control chars (e.g. \377)
;; insert correctly.
(insert (substitute-command-keys (concat "\\{" name "}"))))))
;; Cleanup.
(when used-gentemp
(makunbound keymap))))
;;; Replacements for old lib-src/ programs. Don't seem especially useful.

View File

@ -123,4 +123,32 @@ Return first line of the output of (describe-function-1 FUNC)."
(goto-char (point-min))
(should (looking-at "^font-lock-comment-face is "))))
;;; Tests for describe-keymap
(ert-deftest help-fns-test-describe-keymap/symbol ()
(describe-keymap 'minibuffer-local-must-match-map)
(with-current-buffer "*Help*"
(should (looking-at "^minibuffer-local-must-match-map is"))))
(ert-deftest help-fns-test-describe-keymap/value ()
(describe-keymap minibuffer-local-must-match-map)
(with-current-buffer "*Help*"
(should (looking-at "^key"))))
(ert-deftest help-fns-test-describe-keymap/not-keymap ()
(should-error (describe-keymap nil))
(should-error (describe-keymap emacs-version)))
(ert-deftest help-fns-test-describe-keymap/let-bound ()
(let ((foobar minibuffer-local-must-match-map))
(describe-keymap foobar)
(with-current-buffer "*Help*"
(should (looking-at "^key")))))
(ert-deftest help-fns-test-describe-keymap/dynamically-bound-no-file ()
(setq help-fns-test--describe-keymap-foo minibuffer-local-must-match-map)
(describe-keymap 'help-fns-test--describe-keymap-foo)
(with-current-buffer "*Help*"
(should (looking-at "^help-fns-test--describe-keymap-foo is"))))
;;; help-fns-tests.el ends here