[英]Show Keys In Emacs Keymap Value
When I query the current value of the keymap, eg with M-: (current-local-map)
, it shows me something along these lines: 当我查询键盘映射的当前值时,例如,使用
M-: (current-local-map)
,它向我展示了以下内容:
Value:
(keymap
(S-mouse-2 . muse-follow-name-at-mouse-other-window)
(mouse-2 . muse-follow-name-at-mouse)
(33554445 . muse-follow-name-at-point-other-window)
(S-return . muse-follow-name-at-point-other-window)
(13 . muse-follow-name-at-point)
(return . muse-follow-name-at-point)
keymap
(67108924 . muse-decrease-list-item-indentation)
(67108926 . muse-increase-list-item-indentation)
(M-return . muse-insert-list-item)
(33554441 . muse-previous-reference)
(S-iso-lefttab . muse-previous-reference)
(S-tab . muse-previous-reference)
(S-mouse-2 . muse-follow-name-at-mouse-other-window)
(mouse-2 . muse-follow-name-at-mouse)
(33554445 . muse-follow-name-at-point-other-window)
(9 . muse-next-reference)
(tab . muse-next-reference)
(3 keymap
(19 . muse-search)
(2 . muse-find-backlinks)
(tab . muse-insert-thing)
(9 . muse-insert-thing)
(16 . muse-project-publish)
(6 . muse-project-find-file)
(61 . muse-what-changed)
(22 . muse-browse-result)
(27 keymap
(20 . muse-publish-this-file))
(33554452 . muse-publish-this-file)
(20 . muse-project-publish-this-file)
(12 . font-lock-mode)
(5 . muse-edit-link-at-point)
(1 . muse-index))
keymap
(27 keymap
(9 . ispell-complete-word)))
I want instead of numbers see something more meaningful like (control ?c) return
for example. 我希望代替数字,看到更有意义的内容,例如
(control ?c) return
。 How do I do that ? 我怎么做 ?
Did you know the command Ch m
( describe-mode
), which usually shows a description of the current major and minor modes, usually with their keymaps? 您是否知道命令
Ch m
( describe-mode
),该命令通常显示当前主要模式和次要模式的描述,通常带有其键映射?
(substitute-command-keys "\\\\{foo-map}")
is what describe-mode
uses internally to generate the user-friendly description of the keymap foo-map
. (substitute-command-keys "\\\\{foo-map}")
是describe-mode
内部用于生成键盘映射foo-map
的用户友好描述的内容。
If you'd like to have something closer to the keymap structure, the API is documented in "Classifying Events" in the Emacs Lisp manual. 如果您希望更接近按键映射结构,请在Emacs Lisp手册的“分类事件”中对API进行说明。 For example,
例如,
(event-modifiers 33554445)
==> (shift control)
(event-modifiers 33554445)
==> (shift control)
(format "%c" (event-basic-type 33554445))
==> "m"
(format "%c" (event-basic-type 33554445))
==> "m"
This is what you need: library help-fns+.el
. 这就是您需要的:库
help-fns+.el
。
That gives you, as Ch Mk , command describe-keymap
, which gives you a human-readable description of any keymap bound to a variable. 就像Ch Mk一样 ,这给您提供了
describe-keymap
命令,它为您提供了对绑定到变量的任何键映射的易于理解的describe-keymap
。 Eg: 例如:
Ch Mk dired-mode-map Ch Mk Dired-mode-map
dired-mode-map -------------- For more information check the manuals. Local keymap for `dired-mode' buffers. key binding --- ------- e .. f dired-find-file RET dired-find-file C-o dired-display-file C-t Prefix Command ESC Prefix Command SPC dired-next-line ! dired-do-shell-command # dired-flag-auto-save-files $ dired-hide-subdir % Prefix Command & dired-do-async-shell-command * Prefix Command + dired-create-directory - negative-argument . dired-clean-directory 0 .. 9 digit-argument : Prefix Command dired-next-dirline ? dired-summary A dired-do-search B dired-do-byte-compile C dired-do-copy D dired-do-delete G dired-do-chgrp H dired-do-hardlink L dired-do-load M dired-do-chmod O dired-do-chown P dired-do-print Q dired-do-query-replace-regexp R dired-do-rename S dired-do-symlink T dired-do-touch U dired-unmark-all-marks X dired-do-shell-command Z dired-do-compress ^ dired-up-directory a dired-find-alternate-file d dired-flag-file-deletion g revert-buffer h describe-mode i dired-maybe-insert-subdir j dired-goto-file k dired-do-kill-lines l dired-do-redisplay m dired-mark n dired-next-line o dired-find-file-other-window p dired-previous-line q quit-window s dired-sort-toggle-or-edit t dired-toggle-marks u dired-unmark v dired-view-file w dired-copy-filename-as-kill x dired-do-flagged-delete y dired-show-file-type z kill-this-buffer ~ dired-flag-backup-files DEL dired-unmark-backward mouse-face dired-mouse-find-file-other-window ?? C-t C-t image-dired-dired-toggle-marked-thumbs C-t . image-dired-display-thumb C-t a image-dired-display-thumbs-append C-t c image-dired-dired-comment-files C-t d image-dired-display-thumbs C-t e image-dired-dired-edit-comment-and-tags C-t f image-dired-mark-tagged-files C-t i image-dired-dired-display-image C-t j image-dired-jump-thumbnail-buffer C-t r image-dired-delete-tag C-t t image-dired-tag-files C-t x image-dired-dired-display-external C-M-d dired-tree-down C-M-n dired-next-subdir C-M-p dired-prev-subdir C-M-u dired-tree-up M-$ dired-hide-all M-= dired-backup-diff M-s Prefix Command M-{ dired-prev-marked-file M-} dired-next-marked-file M-DEL dired-unmark-all-files M-s a Prefix Command M-s f Prefix Command % & dired-flag-garbage-files % C dired-do-copy-regexp % H dired-do-hardlink-regexp % R dired-do-rename-regexp % S dired-do-symlink-regexp % d dired-flag-files-regexp % g dired-mark-files-containing-regexp % l dired-downcase % m dired-mark-files-regexp % r dired-do-rename-regexp % u dired-upcase * C-n dired-next-marked-file * C-p dired-prev-marked-file * ! dired-unmark-all-marks * % dired-mark-files-regexp * * dired-mark-executables * / dired-mark-directories * ? dired-unmark-all-files * @ dired-mark-symlinks * c dired-change-marks * m dired-mark * s dired-mark-subdir-files * t dired-toggle-marks * u dired-unmark * DEL dired-unmark-backward : d epa-dired-do-decrypt : e epa-dired-do-encrypt : s epa-dired-do-sign : v epa-dired-do-verify dired-undo dired-next-line dired-previous-line dired-toggle-read-only dired-undo M-s f C-s dired-isearch-filenames M-s f ESC Prefix Command M-s a C-s dired-do-isearch M-s a ESC Prefix Command M-s f C-M-s dired-isearch-filenames-regexp M-s a C-M-s dired-do-isearch-regexp
I just wrote the following based on Gilles' answer, so I figured I'd post it. 我只是根据Gilles的回答写了以下内容,所以我认为应该发表。
I see that Drew's describe-keymap
has a very similar basis, but also covers various other use-cases, so offhand I'm inclined to suggest using that one as a more complete solution; 我看到Drew的
describe-keymap
具有非常相似的基础,但也涵盖了其他各种用例,因此,我倾向于建议将其用作更完整的解决方案。 but FWIW: 但FWIW:
(defun my-describe-keymap (keymap)
"Describe a keymap using `substitute-command-keys'."
(interactive
(list (completing-read
"Keymap: " (let (maps)
(mapatoms (lambda (sym)
(and (boundp sym)
(keymapp (symbol-value sym))
(push sym maps))))
maps)
nil t)))
(with-output-to-temp-buffer (format "*keymap: %s*" keymap)
(princ (format "%s\n\n" keymap))
(princ (substitute-command-keys (format "\\{%s}" keymap)))
(with-current-buffer standard-output ;; temp buffer
(setq help-xref-stack-item (list #'my-describe-keymap keymap)))))
Here's a poor-man's implementation what describe-bindings
( Ch b ) gives you, but restricted to a particular keymap. 这是一个穷人的实现,
describe-bindings
( Ch b )提供给您,但仅限于特定的键映射。 The formatting isn't great, but should get you started: 格式不好,但是应该可以帮助您入门:
(defun describe-keymap (keymap &optional prefix)
(pop-to-buffer "Keymap description")
(erase-buffer)
(describe-keymap-impl keymap prefix))
(defun describe-keymap-impl (keymap &optional prefix)
"show a description of keymap"
(let (keymaps-to-process)
(mapc (lambda (partofkeymap)
(when prefix
(insert (concat prefix " ")))
(insert (key-description (list partofkeymap)))
(insert " ")
(cond ((atom partofkeymap))
((listp (cdr partofkeymap))
(insert "prefix-key")
(if (eq 'keymap (cadr partofkeymap))
(setq keymaps-to-process (cons partofkeymap keymaps-to-process))))
(t
(insert (symbol-name (cdr partofkeymap)))))
(insert "\n"))
(if (and (symbolp keymap) (boundp keymap))
(symbol-value keymap)
keymap))
(while keymaps-to-process
(insert "\n\n")
(describe-keymap-impl (cddar keymaps-to-process) (concat prefix (key-description (list (caar keymaps-to-process)))))
(setq keymaps-to-process (cdr keymaps-to-process))))
nil)
I tested by evaluating both: 我通过评估两者进行了测试:
(describe-keymap emacs-lisp-mode-map)
(describe-keymap 'emacs-lisp-mode-map)
For a more modern approach, use the which-key-show-full-keymap
command from the which-key package. 对于更现代的方法,请使用which-key包中的
which-key-show-full-keymap
命令。 It will ask you for a keymap and then show you all the bindings from that keymap, exactly like it would if you press a prefix key (if which-key-mode
is enabled). 它将要求您提供一个键盘映射,然后向您显示该键盘映射的所有绑定,就像您按前缀键(如果启用了
which-key-mode
)一样。 That is, in the minibuffer, nice and clean. 也就是说,在迷你缓冲区中,干净整洁。
From the documentation: 从文档中:
which-key-show-full-keymap
is an interactive autoloaded compiled Lisp function in 'which-key.el'.which-key-show-full-keymap
是'that-key.el'中的交互式自动加载的已编译Lisp函数。(which-key-show-full-keymap KEYMAP)
(哪个键显示完整的键映射KEYMAP)
Show all bindings in KEYMAP using which-key.
使用which-key显示KEYMAP中的所有绑定。 KEYMAP is selected interactively from all available keymaps.
从所有可用的按键图中以交互方式选择KEYMAP。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.