Como fazer Mx e Ch f compartilharem a história?

11

É bastante comum consultar a documentação de um comando C-h fe depois invocá-lo M-ximediatamente depois.

No momento, a maneira mais curta que encontrei para "chamar o último comando de exibição" é copiar seu nome (do buffer de ajuda ou do histórico) e puxá-lo para M-xo prompt do minibuffer.

O que eu realmente gostaria é que os nomes de comando dados describe-functionsejam parte da história do execute-extended-command. Então eu poderia fazer M-x M-p RET.

Qual é a maneira mais fácil de fazer isso?

Malabarba
fonte
1
Não é uma resposta, mas melhoraria seu fluxo de trabalho: você já ouviu falar smexe helm-M-x? o primeiro está no MELPA, o último está incluído helmno MELPA.
Ehvince

Respostas:

7

A "maneira mais fácil" é apenas definir sua própria versão describe-functione vinculá-la C-h f.

Pegue o código vanilla e altere apenas a chamada para, completing-readpara que ele use a mesma lista de histórico que M-x( execute-extended-command), que é 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)

Como encontrei o código original? C-h f describe-function, C-h k M-x, C-h f execute-extended-command. No código para execute-extended-commandvi que ele lê o nome do comando usando read-extended-command, e que chama completing-readpassando extended-command-historycomo HISTORYargumento.

Desenhou
fonte
8

Não posso adicionar uma resposta exata à sua pergunta, mas um fluxo de trabalho que elimina a necessidade.

Eu uso em smexvez de execute-extended-command. Uma vez no minibuffer de smex:

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

Não gosto das ligações padrão, então as personalizei:

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

Observe que é muito fácil chamar o comando do seu buffer de Ajuda. Depois de digitar, C-h fbasta digitar M-x M-n RET. Isso funciona porque em um novo buffer de Ajuda o nome do comando está na parte superior do buffer, abaixo do cursor, e o M-nrecupera no minibuffer.

No entanto, se você desejar adicionar um comando a extended-command-historycada vez que visitar sua documentação, poderá fazer isso com um pequeno conselho:

(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 usando a nova macro define-adviceadicionada em 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
fonte
E se a função procurada não estiver (interactive)?
mbork
(commandp function)verifica se a função pesquisada é interativa porque somente comandos devem ser adicionados extended-command-history. Portanto, se a função pesquisada não for interativa, ela não será adicionada extended-command-history.
link0ff
Ah, eu senti falta disso. Obrigada pelo esclarecimento!
mbork
1

Se você usar helm-M-x, não há necessidade de digitar C-h fpara procurar a documentação dos comandos, basta usar C-jou C-zdurante a execução helm-M-xpara alternar a exibição da documentação.

Veja também os recursos do Helm Mx .

xuchunyang
fonte