Bagaimana cara membuat Mx dan Ch f membagikan sejarah?

11

Cukup umum bahwa saya akan melihat dokumentasi perintah dengan C-h f, dan kemudian menjalankan perintah dengan M-xsegera setelah itu.

Saat ini, cara terpendek yang saya temukan untuk "menjalankan perintah tampilan terakhir" adalah menyalin namanya (baik dari buffer bantuan atau dari sejarah) dan menariknya ke M-xdalam minibuffer prompt.

Apa yang benar-benar saya inginkan adalah nama perintah yang diberikan describe-functionuntuk menjadi bagian dari sejarah execute-extended-command. Jadi saya bisa melakukannya M-x M-p RET.

Apa cara termudah untuk melakukan ini?

Malabarba
sumber
1
Bukan jawaban, tetapi akan meningkatkan alur kerja Anda: pernahkah Anda mendengar smexdan helm-M-x? yang pertama adalah dalam MELPA, yang terakhir termasuk dalam helm, dalam MELPA.
Ehvince

Jawaban:

7

"Cara termudah" adalah hanya mendefinisikan versi Anda sendiri describe-function, dan ikat itu C-h f.

Ambil kode vanilla, dan ubah hanya panggilan completing-readsehingga menggunakan daftar riwayat yang sama dengan M-x( execute-extended-command) yang digunakan 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)

Bagaimana saya menemukan kode asli? C-h f describe-function, C-h k M-x, C-h f execute-extended-command. Dalam kode untuk execute-extended-commandsaya melihat bahwa itu membaca nama perintah menggunakan read-extended-command, dan yang memanggil completing-readlewat extended-command-historysebagai HISTORYargumen.

Drew
sumber
8

Saya dapat menambahkan bukan jawaban yang tepat untuk pertanyaan Anda, tetapi alur kerja yang menghilangkan kebutuhan untuk itu.

Saya menggunakan smexbukan execute-extended-command. Sekali dalam minibuffer dari smex:

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

Saya tidak suka binding default, jadi saya telah menyesuaikannya:

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

Harap perhatikan bahwa sangat mudah untuk menjalankan perintah dari buffer Bantuannya. Setelah mengetik ketik C-h fsaja M-x M-n RET. Ini berfungsi karena dalam buffer Bantuan baru nama perintah ada di bagian atas buffer di bawah kursor, dan M-nmengambilnya ke minibuffer.

Namun, jika Anda ingin menambahkan perintah ke extended-command-historysetiap kali Anda mengunjungi dokumentasinya, maka Anda dapat melakukan ini dengan saran kecil:

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

atau menggunakan makro baru yang baru define-advicesaja ditambahkan di 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
sumber
Bagaimana jika fungsi yang dicari bukan (interactive)?
mbork
(commandp function)memeriksa apakah fungsi yang dicari bersifat interaktif karena hanya perintah yang harus ditambahkan extended-command-history. Jadi jika fungsi yang dicari tidak interaktif, itu tidak ditambahkan extended-command-history.
link0ff
Ah, aku merindukan itu. Terima kasih untuk penjelasannya!
mbork
1

Jika Anda menggunakan helm-M-x, tidak perlu mengetik C-h funtuk mencari dokumentasi perintah, cukup gunakan C-jatau C-zsaat menjalankan helm-M-xuntuk beralih tampilan dokumentasi.

Lihat juga fitur Helm Mx .

xuchunyang
sumber