Jak sprawić, by Mx i Ch f udostępnili historię?

11

Często zdarza się, że przeglądam dokumentację polecenia C-h f, a następnie M-xnatychmiast ją wywołuję.

W tej chwili najkrótszym sposobem, w jaki znalazłem „wywołanie ostatniego polecenia widoku”, jest skopiowanie jego nazwy (z bufora pomocy lub z historii) i przeciągnięcie go do M-xmonitu bufora minibuforów.

Naprawdę chciałbym, aby nazwy poleceń describe-functionbyły częścią historii execute-extended-command. Więc mógłbym po prostu zrobić M-x M-p RET.

Jak najłatwiej to zrobić?

Malabarba
źródło
1
Nie odpowiedź, ale poprawi Twój przepływ pracy: czy słyszałeś o smexi helm-M-x? pierwsza z nich znajduje się w MELPA, druga jest zawarta helmw MELPA.
Ehvince

Odpowiedzi:

7

„Najłatwiejszym sposobem” jest zdefiniowanie własnej wersji describe-functioni powiązanie jej C-h f.

Weź kod waniliowy i zmień tylko wywołanie na, completing-readaby używało tej samej listy historii , której używa 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)

Jak znalazłem oryginalny kod? C-h f describe-function, C-h k M-x, C-h f execute-extended-command. W kodzie dla execute-extended-commandwidziałem, że czyta nazwę polecenia za pomocą read-extended-commandi że wywołuje completing-readprzekazywanie extended-command-historyjako HISTORYargument.

Rysował
źródło
8

Nie mogę podać dokładnej odpowiedzi na twoje pytanie, ale przepływ pracy, który eliminuje potrzebę tego pytania.

Używam smexzamiast execute-extended-command. Raz w minibuforze smex:

  • RET połączenia execute-extended-command
  • C-h f połączenia smex-describe-function
  • M-. połączenia smex-find-function

Nie lubię domyślnych powiązań, więc dostosowałem je:

(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
źródło
6

Pamiętaj, że bardzo łatwo jest wywołać polecenie z bufora Pomocy. Po wpisaniu C-h fwystarczy wpisać M-x M-n RET. Działa to, ponieważ w nowym buforze Pomocy nazwa polecenia znajduje się na górze bufora pod kursorem i M-npobiera ją do minibufora.

Jeśli jednak chcesz dodać polecenie do extended-command-historykażdej wizyty w jego dokumentacji, możesz to zrobić z małą radą:

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

lub używając nowego makra define-advicedodanego właśnie w 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
źródło
Co się stanie, jeśli funkcja podglądu nie jest (interactive)?
mbork
(commandp function)sprawdza, czy funkcja wyszukana jest interaktywna, ponieważ należy do niej dodawać tylko polecenia extended-command-history. Więc jeśli funkcja wyszukiwania nie jest interaktywna, nie jest dodawana do extended-command-history.
link0ff
Ach, tęskniłem za tym. Dziękuję za wyjaśnienie!
mbork
1

Jeśli używasz helm-M-x, nie musisz pisać, C-h faby sprawdzić dokumentacji poleceń, po prostu użyj C-jlub C-zpodczas uruchamiania, helm-M-xaby przełączyć wyświetlanie dokumentacji.

Zobacz także funkcje Helm Mx .

Xuchunyang
źródło