回答:
「最も簡単な方法」は、独自のバージョンのを定義し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
代わりに使用しますexecute-extended-command
。のミニバッファーに入るとsmex
:
execute-extended-command
smex-describe-function
smex-find-function
デフォルトのバインディングが気に入らないので、カスタマイズしました。
(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)))
ヘルプバッファからコマンドを呼び出すのは非常に簡単です。入力後、と入力C-h f
してくださいM-x M-n RET
。これが機能するのは、新しいヘルプバッファーでは、コマンド名がバッファーの下のカーソルの下にありM-n
、ミニバッファーに取得されるためです。
ただし、extended-command-history
ドキュメントにアクセスするたびにコマンドを追加したい場合は、簡単なアドバイスでこれを行うことができます。
(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)
またはdefine-advice
、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))))
(interactive)
ますか?
(commandp function)
コマンドのみをに追加する必要があるため、ルックアップされた関数がインタラクティブであることを確認しますextended-command-history
。したがって、ルックアップされた関数がインタラクティブでない場合、関数はに追加されませんextended-command-history
。
を使用する場合helm-M-x
、C-h f
コマンドのドキュメントを検索するために入力する必要はありません。ドキュメントの表示を切り替えるには、C-j
またはC-z
を実行helm-M-x
しているときに使用します。
Helm Mxの機能も参照してください。
smex
とhelm-M-x
?前者はMELPAにあり、後者はMELPAのに含まれhelm
ています。