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?


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.


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

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

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 .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.