Как заставить Mx и Ch f поделиться историей?

11

Довольно часто я просматриваю документацию команды C-h f, а затем сразу же вызываю команду M-x.

Прямо сейчас самый короткий способ «вызова последней команды просмотра» - это скопировать его имя (из буфера справки или из истории) и вставить его в M-xподсказку минибуфера.

То, что я действительно хотел бы, чтобы имена команд были describe-functionвключены в историю execute-extended-command. Так что я мог просто сделать M-x M-p RET.

Какой самый простой способ сделать это?

Malabarba
источник
1
Не ответ, но улучшит ваш рабочий процесс: вы слышали smexи helm-M-x? первый находится в MELPA, последний включен helmв MELPA.
Ehvince

Ответы:

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))))
link0ff
источник
Что делать, если функция поиска не (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 .

xuchunyang
источник