Come fare in modo che Mx e Ch f condividano la storia?


11

È abbastanza comune che esaminerò la documentazione di un comando C-h fe quindi invocherò il comando M-ximmediatamente dopo.

In questo momento, il modo più breve che ho trovato per "invocare l'ultimo comando di visualizzazione" è di copiarne il nome (dal buffer della guida o dalla cronologia) e M-xtrascinarlo nel prompt del minibuffer.

Quello che vorrei davvero è che i nomi dei comandi dati describe-functionfossero parte della storia di execute-extended-command. Quindi potrei semplicemente fare M-x M-p RET.

Qual è il modo più semplice per farlo?


1
Non una risposta, ma migliorerebbe il tuo flusso di lavoro: ne hai sentito parlare smexe helm-M-x? il primo è in MELPA, il secondo è incluso in helm, in MELPA.
Ehvince,

Risposte:


7

Il "modo più semplice" è semplicemente definire la propria versione di describe-functione collegarla a C-h f.

Prendi il codice vanilla e modifica solo la chiamata in completing-readmodo che utilizzi lo stesso elenco di cronologia utilizzato da M-x( execute-extended-command), ovvero 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)

Come ho trovato il codice originale? C-h f describe-function, C-h k M-x, C-h f execute-extended-command. Nel codice per execute-extended-commandho visto che legge il nome del comando usando read-extended-commande che chiama completing-readpassando extended-command-historycome HISTORYargomento.


8

Posso aggiungere non una risposta esatta alla tua domanda, ma un flusso di lavoro che elimina la necessità.

Io uso smexinvece di execute-extended-command. Una volta nel minibuffer di smex:

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

Non mi piacciono i collegamenti predefiniti, quindi li ho personalizzati:

(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

Si noti che è molto semplice richiamare il comando dal relativo buffer della Guida. Dopo aver digitato C-h fbasta digitare M-x M-n RET. Questo funziona perché in un nuovo buffer della Guida il nome del comando si trova nella parte superiore del buffer sotto il cursore e lo M-nrecupera nel minibuffer.

Tuttavia, se vuoi aggiungere un comando extended-command-historyogni volta che visiti la sua documentazione, puoi farlo con un piccolo consiglio:

(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 nuova macro define-adviceappena aggiunta in 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))))

Cosa succede se la funzione di ricerca non lo è (interactive)?
mbork,

(commandp function)verifica che la funzione di ricerca sia interattiva poiché è necessario aggiungere solo i comandi extended-command-history. Quindi, se la funzione di ricerca non è interattiva, non viene aggiunta a extended-command-history.
link0ff

Ah, l'ho perso. Grazie per la spiegazione!
mbork,

1

Se si utilizza helm-M-x, non è necessario digitare C-h fper cercare la documentazione dei comandi, basta usare C-jo C-zdurante l'esecuzione helm-M-xper attivare / disattivare la visualizzazione della documentazione.

Vedi anche le funzionalità di Helm Mx .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.