¿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?


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.


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

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

¿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 .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.