Làm thế nào để Mx và Ch f chia sẻ lịch sử?


11

Điều khá phổ biến là tôi sẽ xem qua tài liệu của một lệnh C-h fvà sau đó gọi lệnh M-xngay sau đó.

Ngay bây giờ, cách ngắn nhất mà tôi tìm thấy để gọi ra lệnh xem cuối cùng, đó là sao chép tên của nó (từ bộ đệm trợ giúp hoặc từ lịch sử) và đưa nó vào M-xdấu nhắc của trình thu thập dữ liệu.

Những gì tôi thực sự muốn là cho các tên lệnh được đưa ra describe-functionlà một phần của lịch sử execute-extended-command. Vì vậy tôi chỉ có thể làm M-x M-p RET.

Cách dễ nhất để làm điều này là gì?


1
Không phải là một câu trả lời, nhưng sẽ cải thiện quy trình làm việc của bạn: bạn đã nghe nói về smexhelm-M-x? cái trước nằm trong MELPA, cái sau được bao gồm helmtrong MELPA.
Ehvince

Câu trả lời:


7

"Cách dễ nhất" là chỉ xác định phiên bản của riêng bạn describe-functionvà liên kết nó với C-h f.

Lấy mã vanilla và chỉ thay đổi cuộc gọi để completing-readnó sử dụng cùng một danh sách lịch sử mà M-x( execute-extended-command) sử dụng 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)

Làm thế nào tôi tìm thấy mã gốc? C-h f describe-function, C-h k M-x, C-h f execute-extended-command. Trong mã cho execute-extended-commandtôi thấy rằng nó đọc tên lệnh bằng cách sử dụng read-extended-commandvà các cuộc gọi đó completing-readchuyển qua extended-command-historylàm HISTORYđối số.


8

Tôi có thể thêm không phải là một câu trả lời chính xác cho câu hỏi của bạn, nhưng một quy trình làm việc loại bỏ sự cần thiết cho nó.

Tôi sử dụng smexthay vì execute-extended-command. Khi đã ở trong xe buýt nhỏ của smex:

  • RET cuộc gọi execute-extended-command
  • C-h f cuộc gọi smex-describe-function
  • M-. cuộc gọi smex-find-function

Tôi không thích các ràng buộc mặc định, vì vậy tôi đã tùy chỉnh chúng:

(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

Xin lưu ý rằng việc gọi lệnh từ bộ đệm Trợ giúp của nó rất dễ dàng. Sau khi gõ C-h fchỉ cần gõ M-x M-n RET. Điều này hoạt động vì trong bộ đệm Trợ giúp mới, tên lệnh nằm ở đầu bộ đệm dưới con trỏ và M-ntruy xuất nó vào bộ đệm.

Tuy nhiên, nếu bạn muốn thêm một lệnh vào extended-command-historymỗi lần bạn truy cập tài liệu của nó, thì bạn có thể thực hiện việc này với một lời khuyên nhỏ:

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

hoặc sử dụng macro mới define-advicevừa được thêm vào 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))))

Nếu chức năng tra cứu thì không (interactive)?
mbork

(commandp function)kiểm tra xem chức năng tra cứu có tương tác không vì chỉ thêm các lệnh extended-command-history. Vì vậy, nếu chức năng tra cứu không tương tác, nó sẽ không được thêm vào extended-command-history.
link0ff

Ah, tôi đã bỏ lỡ điều đó. Cảm ơn đã giải thích!
mbork

1

Nếu bạn sử dụng helm-M-x, không cần phải gõ C-h fđể tra cứu tài liệu của lệnh, chỉ cần sử dụng C-jhoặc C-ztrong khi chạy helm-M-xđể chuyển đổi hiển thị tài liệu.

Xem thêm các tính năng của Helm Mx .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.