จะทำให้ Mx และ Ch f แชร์ประวัติได้อย่างไร


11

เป็นเรื่องปกติที่ฉันจะตรวจสอบเอกสารของคำสั่งด้วยC-h fแล้วให้เรียกใช้คำสั่งM-xทันทีหลังจากนั้น

ตอนนี้วิธีที่สั้นที่สุดที่ฉันพบว่า "เรียกใช้คำสั่งดูครั้งสุดท้าย" คือการคัดลอกชื่อ (ไม่ว่าจะเป็นจากบัฟเฟอร์ความช่วยเหลือหรือจากประวัติ) และดึงมันลงในM-xพรอมต์ของ minibuffer

สิ่งที่ผมจะชอบเป็นชื่อคำสั่งที่กำหนดให้ เป็นส่วนหนึ่งของประวัติศาสตร์ของdescribe-function ดังนั้นผมก็สามารถทำexecute-extended-commandM-x M-p RET

วิธีที่ง่ายที่สุดในการทำเช่นนี้คืออะไร?


1
ไม่ได้คำตอบ แต่จะปรับปรุงขั้นตอนการทำงานของคุณ: คุณเคยได้ยินsmexและhelm-M-x? อดีตอยู่ใน MELPA หลังรวมอยู่helmใน MELPA
Ehvince

คำตอบ:


7

ว่า "วิธีที่ง่ายที่สุด" เป็นเพียงการกำหนดรุ่นของคุณเองและผูกที่describe-functionC-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หนึ่งครั้งใน minibuffer ของ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ดึงไปยัง minibuffer

อย่างไรก็ตามหากคุณต้องการเพิ่มคำสั่งใน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ด้วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.