Comment faire partager l'histoire à Mx et Ch f?

11

Il est assez courant de parcourir la documentation d'une commande avec C-h f, puis d'appeler la commande M-ximmédiatement après.

À l'heure actuelle, le moyen le plus court que j'ai trouvé pour «invoquer la dernière commande de vue» consiste à copier son nom (à partir du tampon d'aide ou de l'historique) et à le copier dans M-xl'invite du mini- tampon de .

Ce que j'aimerais vraiment, c'est que les noms de commandes donnés describe-functionfassent partie de l'histoire de execute-extended-command. Donc je pouvais juste faire M-x M-p RET.

Quelle est la façon la plus simple de procéder?

Malabarba
la source
1
Pas une réponse, mais améliorerait votre flux de travail: avez-vous entendu parler de smexet helm-M-x? le premier fait partie du MELPA, le second fait partie helmdu MELPA.
Ehvince

Réponses:

7

La "manière la plus simple" consiste à simplement définir votre propre version de describe-functionet à la lier à C-h f.

Prenez le code vanilla et modifiez uniquement l'appel pour completing-readqu'il utilise la même liste d'historique que M-x( execute-extended-command), qui est extended-command-history.

(defun my-describe-function (function)
  "Display the full documentation of FUNCTION (a symbol)."
  (interactive
   (let ((fn (function-called-at-point))
         (enable-recursive-minibuffers t)
         val)
     (setq val (completing-read
                (if fn
                    (format "Describe function (default %s): " fn)
                  "Describe function: ")
                obarray 'fboundp t nil
                'extended-command-history ; <======================
                (and fn (symbol-name fn))))
     (list (if (equal val "") fn (intern val)))))
  (if (null function)
      (message "You didn't specify a function")
    (help-setup-xref (list #'describe-function function)
                     (called-interactively-p 'interactive))
    (save-excursion
      (with-help-window (help-buffer)
        (prin1 function)
        (princ " is ")
        (describe-function-1 function)
        (with-current-buffer standard-output
          (buffer-string))))))

(global-set-key "\C-hf" 'my-describe-function)

Comment ai-je trouvé le code d'origine? C-h f describe-function, C-h k M-x, C-h f execute-extended-command. Dans le code car execute-extended-commandj'ai vu qu'il lit le nom de la commande en utilisant read-extended-command, et que les appels completing-readpassent extended-command-historycomme HISTORYargument.

A dessiné
la source
8

Je peux ajouter non pas une réponse exacte à votre question, mais un flux de travail qui en élimine le besoin.

J'utilise à la smexplace de execute-extended-command. Une fois dans le mini-tampon de smex:

  • RET appels execute-extended-command
  • C-h f appels smex-describe-function
  • M-. appels smex-find-function

Je n'aime pas les liaisons par défaut, je les ai donc personnalisées:

(eval-after-load 'smex
  `(defun smex-prepare-ido-bindings ()
     (define-key ido-completion-map (kbd "TAB") 'minibuffer-complete)
     (define-key ido-completion-map (kbd "C-,") 'smex-describe-function)
     (define-key ido-completion-map (kbd "C-w") 'smex-where-is)
     (define-key ido-completion-map (kbd "C-.") 'smex-find-function)
     (define-key ido-completion-map (kbd "C-a") 'move-beginning-of-line)
     (define-key ido-completion-map "\C-i" 'smex-helm)))
abo-abo
la source
6

Veuillez noter qu'il est très facile d'appeler la commande à partir de son tampon d'aide. Après avoir tapé, tapez C-h fsimplement M-x M-n RET. Cela fonctionne car dans un nouveau tampon d'aide, le nom de la commande se trouve en haut du tampon sous le curseur et le M-nrécupère dans le mini- tampon .

Cependant, si vous souhaitez ajouter une commande à extended-command-historychaque fois que vous visitez sa documentation, vous pouvez le faire avec un petit conseil:

(defun describe-function-extended-command-history (function)
  "Add command name to the history."
  (when (commandp function)
    (add-to-history 'extended-command-history (symbol-name function))))

(advice-add 'describe-function :before #'describe-function-extended-command-history)

ou en utilisant la nouvelle macro qui define-advicevient d'être ajoutée dans 25.0.50:

(define-advice describe-function (:before (function))
  "Add command name to the history."
  (when (commandp function)
    (add-to-history 'extended-command-history (symbol-name function))))
link0ff
la source
Et si la fonction de recherche ne l'est pas (interactive)?
mbork
(commandp function)vérifie que la fonction de recherche est interactive car seules les commandes doivent être ajoutées extended-command-history. Donc, si la fonction de recherche n'est pas interactive, elle n'est pas ajoutée extended-command-history.
link0ff
Ah, j'ai raté ça. Merci pour l'explication!
mbork
1

Si vous utilisez helm-M-x, il n'est pas nécessaire de taper C-h fpour rechercher la documentation des commandes, utilisez simplement C-jou C-zpendant l'exécution helm-M-xpour basculer l'affichage de la documentation.

Voir aussi les fonctionnalités de Helm Mx .

xuchunyang
la source