MxとCh fに履歴を共有させる方法は?


11

コマンドのドキュメントをで確認しC-h fM-x直後にでコマンドを呼び出すのはよくあることです。

現在、「最後のビューコマンドを呼び出す」ために見つけた最短の方法は、その名前を(ヘルプバッファーまたは履歴から)コピーして、M-xのミニバッファープロンプトにヤンクすることです。

私が本当に欲しいのは、与えられたコマンド名 describe-functionがの歴史の一部であることです execute-extended-command。だから私はただすることができましたM-x M-p RET

これを行う最も簡単な方法は何ですか?


1
答えは、しかし、あなたのワークフローを改善することになるではない:あなたは聞いたことがあるsmexhelm-M-x?前者はMELPAにあり、後者はMELPAのに含まれhelmています。
Ehvince 2014年

回答:


7

「最も簡単な方法」は、独自のバージョンのを定義しdescribe-function、それをにバインドすることC-h fです。

通常のコードを受け取り、呼び出しだけを変更して、()が使用completing-readするのと同じ履歴リストを使用するようにします。M-xexecute-extended-commandextended-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-functionC-h k M-xC-h f execute-extended-command。のコードでは、execute-extended-commandを使用してコマンド名を読み取り、引数として渡すread-extended-commandことを呼び出しcompleting-readextended-command-historyいることがわかりましたHISTORY


8

私はあなたの質問に正確な答えを追加することはできませんが、その必要性を排除するワークフローを追加できます。

smex代わりに使用しますexecute-extended-command。のミニバッファーに入るとsmex

  • RET 呼び出し execute-extended-command
  • C-h f 呼び出し smex-describe-function
  • M-. 呼び出し 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)))

6

ヘルプバッファからコマンドを呼び出すのは非常に簡単です。入力後、と入力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)ますか?
mbork 2014年

(commandp function)コマンドのみをに追加する必要があるため、ルックアップされた関数がインタラクティブであることを確認しますextended-command-history。したがって、ルックアップされた関数がインタラクティブでない場合、関数はに追加されませんextended-command-history
link0ff 2014年

ああ、私はそれを逃した。説明ありがとう!
mbork 2014年

1

を使用する場合helm-M-xC-h fコマンドのドキュメントを検索するために入力する必要はありません。ドキュメントの表示を切り替えるには、C-jまたはC-zを実行helm-M-xしているときに使用します。

Helm Mxの機能も参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.