Як змусити Mx і Ch f поділитися історією?


11

Цілком звичайно, що я перегляну документацію команди C-h f, а потім M-xодразу після цього викличу команду .

Наразі найкоротший спосіб, з якого я виявив "викликати останню команду перегляду", - скопіювати його ім'я (або з довідкового буфера, або з історії) та підключити його до M-xзапиту minibuffer.

Мені б дуже хотілося, щоб імена команд describe-functionбули частиною історії execute-extended-command. Тому я міг просто зробити M-x M-p RET.

Який найпростіший спосіб зробити це?


1
Не відповідь, але покращив би ваш робочий процес: ви чули smexі helm-M-x? перший - у MELPA, останній - helmу MELPA.
Переконайтеся

Відповіді:


7

"Найпростіший спосіб" - це просто визначити свою власну версію 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аргумент.


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

(commandp function)перевіряє, чи переглянута функція є інтерактивною, оскільки до неї слід додавати лише команди extended-command-history. Тож якщо переглянута функція не є інтерактивною, її не додають extended-command-history.
link0ff

Ах, я пропустив це. Дякую за пояснення!
mbork

1

Якщо ви користуєтесь helm-M-x, не потрібно вводити C-h fдля пошуку документації команд, просто використовуйте C-jабо C-zпід час запуску helm-M-xперемикайте відображення документації.

Дивіться також особливості Helm Mx .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.