«Самый простой способ» - просто определить свою собственную версию describe-function
и связать ее с C-h f
.
Возьмите ванильный код и измените только вызов completing-read
так, чтобы он использовал тот же список истории, который использует M-x
( execute-extended-command
), то есть 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-h f describe-function
, C-h k M-x
, C-h f execute-extended-command
. В коде для execute-extended-command
я увидел, что он читает имя команды, используя read-extended-command
, и это вызывает completing-read
передачу extended-command-history
в качестве HISTORY
аргумента.
smex
иhelm-M-x
? первый находится в MELPA, последний включенhelm
в MELPA.