2010-08-13 12 views
24

Cuando consultar el valor actual del mapa de teclado, por ejemplo, con M-: (current-local-map), que me muestra algo en este sentido:mostrar las teclas en Emacs Keymap Valor

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

quiero en lugar de números de ver algo más significativo como (control ?c) return de ejemplo. Cómo puedo hacer eso ?

Respuesta

17

Esto es lo que necesita: help-fns+.el biblioteca.

que le brinda, como C-h M-k, di describe-keymap, que le da una descripción legible por humanos de cualquier mapa de teclas con destino a una variable. Ej .:

C-h k M-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 

+0

¡este es bueno! – EvgeniySharapov

+0

Quien sea : ¿Te importa explicar por qué bajaste esta respuesta? – Drew

+0

He instalado (mediante 'package-install') 'help +' y 'help-fns +', pero ni 'C-h M-k' ni' C-h C-k' están definidos, ni hay un comando 'describe-keymap'. –

18
  • ¿Usted sabía el comando C-h m (describe-mode), que por lo general muestra una descripción de los modos mayor y menor actuales, por lo general con sus mapas de teclas?

  • (substitute-command-keys "\\{foo-map}") es lo que describe-mode utiliza internamente para generar la descripción fácil de usar del mapa de teclas foo-map.

  • Si desea tener algo más cerca de la estructura del mapa de teclas, la API está documentada en "Clasificar eventos" en el manual de Emacs Lisp. Por ejemplo,
    (event-modifiers 33554445) ==>(shift control)
    (format "%c" (event-basic-type 33554445)) ==>"m"

+1

¡Esta es una buena respuesta simple! (Simplemente evalúe (sustituir-teclas de comando "\\ {foo-map}"); ¿por qué no lo he pensado?) –

2

Aquí está la implementación de un hombre pobre lo describe-bindings (C-H B) le da, pero limitada a un mapa de teclado en particular. El formato no es grande, pero debería empezar:

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

He probado mediante la evaluación de ambos:

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

Pero no debería necesitar volver a implementar describe-bindings. Solo la función disponible, describir enlaces, debería poder hacer lo que se necesita para cualquier mapa de teclas arbitrario. Considere 'describe-mode ': imprime los mapas de teclas especificados por expresiones del formulario \ {MAPVAR} dentro de la documentación en forma legible por humanos. Su salida es la cadena de documentación de la función de modo formateada por la función 'documentation '; a su vez, la función 'documentation 'usa' substitute-command-keys', que a su vez llama exactamente 'describe-bindings 'para formatear expresiones \ MAPVAR en la cadena de documentos de origen. –

+0

Después de estudiar la fuente Elisp, descubrí que, contrariamente a lo que he escrito anteriormente y a lo que se puede inferir de la documentación, 'describe-bindings 'no toma un mapa de teclas como argumento. :( Pero la documentación de 'orden de sustitución-keys' supone claramente esto: "subcadenas de la forma \ {} MAPVAR se sustituyen por los resúmenes (hechas por 'describe-bindings') del valor de MAPVAR , tomado como un mapa de teclas. " Quizás, uno puede superar esto instalando el mapa de teclas interesante como un mapa de teclas local en un búfer temporal, y ejecutando el estándar' describir-enlaces 'allí ... –

+0

Eso es exactamente lo que 'describe- keymap', en [help-fns + .el] (http://www.emacswiki.org/emacs/download/help-fns%2b.el) sí. Consulte mi respuesta, arriba. – Drew

0

que acabo de escribir la siguiente en función de la respuesta de Gilles, por lo que pensé que había puesto él.

Veo que Drew's describe-keymap tiene una base muy similar, pero también cubre varios otros casos de uso, así que de improviso me inclino a sugerir que se use como una solución más completa; pero 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))))) 
Cuestiones relacionadas