¿Cómo hacer que Mx y Ch f compartan la historia?

11

Es bastante común que revise la documentación de un comando C-h fy luego invoque el comando M-xinmediatamente después.

En este momento, la forma más corta que he encontrado para "invocar el último comando de vista" es copiar su nombre (ya sea desde el búfer de ayuda o desde el historial) y tirarlo al M-xindicador del minibúfer.

Lo que realmente me gustaría es que los nombres de comandos dados describe-functionsean parte de la historia de execute-extended-command. Entonces solo podría hacer M-x M-p RET.

¿Cuál es la forma más fácil de hacer esto?

Malabarba
fuente
1
No es una respuesta, pero mejoraría su flujo de trabajo: ¿ha oído hablar de smexy helm-M-x? el primero está en MELPA, el segundo está incluido helmen MELPA.
Ehvince

Respuestas:

7

La "forma más fácil" es definir su propia versión describe-functiony vincularla C-h f.

Tome el código vainilla y cambie solo la llamada a completing-readpara que use la misma lista de historial que M-x( execute-extended-command) usa, que es 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)

¿Cómo encontré el código original? C-h f describe-function, C-h k M-x, C-h f execute-extended-command. En el código para execute-extended-commandque vi que lee el nombre del comando usando read-extended-command, y que llama completing-readpasar extended-command-historycomo HISTORYargumento.

Dibujó
fuente
8

No puedo agregar una respuesta exacta a su pregunta, sino un flujo de trabajo que elimine la necesidad de hacerlo.

Yo uso en smexlugar de execute-extended-command. Una vez en el minibúfer de smex:

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

No me gustan los enlaces predeterminados, así que los he personalizado:

(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
fuente
6

Tenga en cuenta que es muy fácil invocar el comando desde su búfer de Ayuda. Después de escribir C-h fsimplemente escriba M-x M-n RET. Esto funciona porque en un nuevo búfer de Ayuda, el nombre del comando está en la parte superior del búfer debajo del cursor y lo M-nrecupera en el minibúfer.

Sin embargo, si desea agregar un comando extended-command-historycada vez que visita su documentación, puede hacerlo con un pequeño consejo:

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

o usando la nueva macro define-advicerecién agregada en 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
fuente
¿Qué pasa si la función de búsqueda no lo es (interactive)?
mbork
(commandp function)comprueba que la función buscada sea interactiva porque solo se deben agregar comandos extended-command-history. Entonces, si la función buscada no es interactiva, no se agrega a extended-command-history.
link0ff
Ah, me perdí eso. ¡Gracias por la explicación!
mbork
1

Si lo usa helm-M-x, no es necesario escribir C-h fpara buscar la documentación de los comandos, solo use C-jo C-zmientras se ejecuta helm-M-xpara alternar la visualización de la documentación.

Ver también las características de Helm Mx .

xuchunyang
fuente