2010-08-13 32 views
24

当我询问键盘映射的电流值,例如与M-: (current-local-map),它让我看到这些方针的东西:显示键在Emacs的键盘映射值

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))) 

我要的不是数字看到更有意义的事情像(control ?c) return为例。我怎么做 ?

回答

17

这是你所需要的:库help-fns+.el

这使你,如C-H M-ķ,指挥describe-keymap,它给你绑定到变量任何键映射的人类可读的描述。例如: -

C-高中-K dired模式地图

 

    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 

+0

这个很好! – EvgeniySharapov 2012-05-11 12:10:55

+0

无论谁:小心解释为什么你低估了这个答案? – Drew 2014-01-27 21:05:27

+0

我已经安装(通过'package-install') 'help +'和'help-fns +',但既没有定义“C-h M-k”或“C-h C-k”,也没有定义“describe-keymap”命令。 – 2016-05-02 13:19:50

18
  • 你知道命令C-h mdescribe-mode),通常显示当前的主要和次要模式的说明,通常与他们的键盘布局?

  • (substitute-command-keys "\\{foo-map}")是什么describe-mode内部使用生成的关键图foo-map的用户友好的描述。

  • 如果您希望有更接近键映射结构的东西,API将记录在Emacs Lisp手册的“分类事件”中。例如,
    (event-modifiers 33554445) ==>(shift control)
    (format "%c" (event-basic-type 33554445)) ==>"m"

+1

这是一个很好的简单的答案! (简单评估(替代命令键“\\ {foo-map}”);为什么我没有想到这个!) – 2010-08-13 23:57:07

2

这里有一个人可怜的实现什么describe-bindingsC-H B)给你,但仅限于特定的键盘映射。该格式是不是很大,但应该让你开始:

(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) 

我测试通过评估两种:

(describe-keymap emacs-lisp-mode-map) 
(describe-keymap 'emacs-lisp-mode-map) 
+2

但是你不应该需要重新实现describe-bindings。只有可用的函数 - describe-bindings - 应该能够完成任意键盘映射所需的功能。 考虑'describe-mode':它以可读的形式在文档中打印由\ {MAPVAR}形式的表达式指定的键盘映射。它的输出是由'documentation'函数格式化的模式函数的文档字符串;反过来,'documentation'函数使用'substitute-command-keys',它依次调用'describe-bindings'来格式化源文档字符串中的{{MAPVAR}表达式。 – 2010-08-13 23:37:27

+0

在研究了Elisp源代码之后,我发现与我上面写的以及文档中可以推断出的内容相反,“describe-bindings”不会将keymap作为参数。 :( 但对于'替代-命令键的文档清楚地设此: “形式\ {MAPVAR}的子串被摘要 (由'描述-绑定作出替代MAPVAR的值的) ,作为一个键盘映射。“ 也许,人们可以通过将有趣的键盘映射作为本地键盘映射安装在临时缓冲区中,并在那里运行标准的”描述绑定“来克服这个问题...... – 2010-08-13 23:46:42

+0

这正是”describe- keymap',在[help-fns + .el](http://www.emacswiki.org/emacs/download/help-fns%2b.el)中可以找到。请参阅我的回答,以上。 – Drew 2013-10-12 21:08:29

0

我只是写了下面的根据吉尔的回答,所以我想我会张贴。

我看到德鲁的describe-keymap有一个非常相似的基础,但也涵盖了其他各种用例,所以我倾向于建议使用那个作为更完整的解决方案;但是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)))))