Wie kann man Mx und Ch f dazu bringen, die Geschichte zu teilen?

11

Es ist durchaus üblich, dass ich die Dokumentation eines Befehls mit durchschaue C-h fund den Befehl M-xunmittelbar danach mit aufrufe.

Im Moment besteht der kürzeste Weg, den letzten Ansichtsbefehl aufzurufen, darin, seinen Namen (entweder aus dem Hilfepuffer oder aus dem Verlauf) zu kopieren und in M-xdie Minibuffer-Eingabeaufforderung zu ziehen.

Was ich wirklich möchte, ist, dass Befehlsnamen describe-functionTeil der Geschichte von sind execute-extended-command. Also könnte ich es einfach tun M-x M-p RET.

Was ist der einfachste Weg, dies zu tun?

Malabarba
quelle
1
Keine Antwort, würde aber Ihren Workflow verbessern: Haben Sie von smexund gehört helm-M-x? Ersteres ist in MELPA, Letzteres ist helmin MELPA enthalten.
Ehvince

Antworten:

7

Der "einfachste Weg" besteht darin, einfach eine eigene Version von zu definieren describe-functionund diese zu binden C-h f.

Nehmen Sie den Vanille-Code und ändern Sie nur den Aufruf in, completing-readsodass er dieselbe Verlaufsliste verwendet, die M-x( execute-extended-command) verwendet 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)

Wie habe ich den Originalcode gefunden? C-h f describe-function, C-h k M-x, C-h f execute-extended-command. Im Code für habe execute-extended-commandich gesehen, dass er den Befehlsnamen mit liest read-extended-commandund die completing-readÜbergabe extended-command-historyals HISTORYArgument aufruft .

Drew
quelle
8

Ich kann Ihrer Frage keine genaue Antwort hinzufügen, sondern einen Workflow, der dies überflüssig macht.

Ich benutze smexstatt execute-extended-command. Einmal im Minipuffer von smex:

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

Ich mag die Standardbindungen nicht, deshalb habe ich sie angepasst:

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

Bitte beachten Sie, dass es sehr einfach ist, den Befehl aus dem Hilfepuffer aufzurufen. Nach der Eingabe C-h feinfach eingeben M-x M-n RET. Dies funktioniert, weil sich in einem neuen Hilfepuffer der Befehlsname oben im Puffer unter dem Cursor befindet und M-nin den Minibuffer abgerufen wird.

Wenn Sie jedoch bei extended-command-historyjedem Besuch der Dokumentation einen Befehl hinzufügen möchten, können Sie dies mit einem kleinen Hinweis tun:

(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)

oder mit dem neuen Makro, das define-advicegerade in 25.0.50 hinzugefügt wurde:

(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
quelle
Was ist, wenn die Suchfunktion nicht (interactive)aktiviert ist ?
mbork
(commandp function)Überprüft, ob die Suchfunktion interaktiv ist, da nur Befehle hinzugefügt werden sollten extended-command-history. Wenn die Suchfunktion also nicht interaktiv ist, wird sie nicht hinzugefügt extended-command-history.
Link0ff
Ah, das habe ich verpasst. Danke für die Erklärung!
mbork
1

Wenn Sie verwenden helm-M-x, müssen Sie nicht C-h feingeben, um die Dokumentation der Befehle nachzuschlagen. Verwenden Sie einfach C-joder C-zwährend der Ausführung, helm-M-xum die Anzeige der Dokumentation umzuschalten.

Siehe auch die Funktionen von Helm Mx .

Xuchunyang
quelle