วิธีค้นหาลำดับคีย์คืออะไร


14

บางครั้งฉันสังเกตเห็นพฤติกรรมที่ไม่คาดคิดเมื่อแก้ไขข้อความ การขอความช่วยเหลือครั้งแรกของฉันมักจะใช้C-h kเพื่อค้นหาว่าฟังก์ชันใดที่ถูกเรียกโดยลำดับของคีย์ที่กำหนด อย่างไรก็ตามบางครั้งเอกสารประกอบจะขัดแย้งกับพฤติกรรมที่สังเกตได้ ในกรณีเหล่านี้ฉันมักจะคิดว่าแพ็กเกจอื่น ๆ บางส่วนได้เชื่อมโยงกับฟังก์ชั่นหรือลำดับของคีย์และกำลังแก้ไขพฤติกรรมของมัน

ฉันจะหา ที่ ฟังก์ชั่น hooking เป็นลำดับสำคัญของฉันได้อย่างไร

ตัวอย่างหนึ่งที่ฉันพบเมื่อเร็ว ๆ นี้คือฉันกด"คีย์และเครื่องหมายคำพูดถูกแทรกที่จุดเริ่มต้นและจุดสิ้นสุดของพื้นที่ที่ใช้งานอยู่ ฉันสงสัยว่านี่ไม่ใช่พฤติกรรมของ Emacs ที่เป็นค่าเริ่มต้นดังนั้นฉันจึงเคยC-h k "ตรวจสอบว่ามีการเรียกใช้ฟังก์ชันใดบ้าง

describe-keyเอกสารบอกว่าฟังก์ชั่นself-insert-commandที่ถูกเรียกว่าซึ่งเป็นฟังก์ชั่น electric-pair-modeที่จะทำให้เรื่องยาวสั้นหลังจากที่จำนวนของการทดลองและข้อผิดพลาดบางอย่างผมก็สามารถที่จะตรวจสอบว่าพฤติกรรมที่เกิดจาก ในอนาคตมีวิธีที่เร็วกว่าที่จะมาถึงข้อสรุปนี้กว่าที่จะปิดแพคเกจที่น่าสงสัยทีละครั้งจนกว่าจะหาผู้กระทำผิด?


เป็นไปได้หรือไม่ว่ามีการelectric-pair-modeเปิดใช้งานในโหมดหลักบางโหมดเท่านั้น? คุณยังคงเห็นself-insert-commandสำหรับ"เมื่อคุณทำC-h kในขณะที่electric-pair-modeมีการใช้งาน?
Kaushal Modi

@kaushalmodi: ปรากฎว่าelectric-pair-modeทำงานได้โดยการเชื่อมต่อเข้าpost-self-insert-hookด้วยกันและไม่ได้เปลี่ยนการผูกกุญแจ
nispio

C-h kบอกให้คุณทราบว่าเกิดอะไรขึ้นกับปุ่มกด ถ้าคุณดูเอกสารประกอบself-insert-commandมันชัดเจนว่าpost-self-insert-hookมีการรันหลังจากคำสั่งเสร็จสิ้น
shosti

@shosti: ในตัวอย่างง่ายๆนี้ใช่ แต่จะเกิดอะไรขึ้นถ้าหากส่วนขยายนั้นใช้after-change-functionsเช่น Jordon กล่าวถึงในคำตอบของเขา? เอกสารสำหรับฟังก์ชั่นอาจจะไม่พูดถึงตะขอนั้นโดยเฉพาะ
nispio

ขออภัยฉันควรเจาะจงมากขึ้น C-h k+ hooks มาตรฐาน == พฤติกรรมที่สมบูรณ์ (มากหรือน้อย) แน่นอนว่าบางครั้งก็ทำให้มีความเป็นไปได้มากมาย แต่ก็ยังมีความโปร่งใสมากกว่าระบบซอฟต์แวร์ที่ซับซ้อนอื่น ๆ ที่ฉันรู้จัก
shosti

คำตอบ:


13

ไม่มีวิธีง่ายๆที่จะรู้ว่าการกดปุ่มเพียงปุ่มเดียวจะทำอะไร

หากคุณเห็นพฤติกรรมเพิ่มเติมให้ตรวจสอบ hooks ทั่วไปทุกครั้ง ดูรายการที่นี่: http://www.gnu.org/software/emacs/manual/html_node/elisp/Standard-Hooks.html

ในกรณีส่วนใหญ่สิ่งสำคัญคือ:

  • หลังจากเปลี่ยนฟังก์ชั่น
  • ก่อนที่จะเปลี่ยนฟังก์ชั่น
  • ครั้งแรกของการเปลี่ยนแปลงเบ็ด
  • โพสต์คำสั่งเบ็ด
  • ก่อนคำสั่งเบ็ด
  • โพสต์ตัวเองใส่เบ็ด

คุณจะต้องตรวจสอบ hooks เหล่านั้นและดูในฟังก์ชั่นที่มีเพื่อดูว่าอันไหนที่ปรับเปลี่ยนพฤติกรรมของคุณ

describe-functionหากฟังก์ชั่นในตะขอเหล่านี้ไม่ครบอธิบายพฤติกรรมที่สังเกตตรวจสอบฟังก์ชั่นสำหรับคำแนะนำซึ่งจะปรากฏในเอกสารของพวกเขาจาก


แก้ไข: ฉันได้เขียนฟังก์ชั่นบางอย่างเพื่อช่วยอธิบายเกี่ยวกับตะขอได้ดีกว่าฟังก์ชั่นทีละตัว: https://gist.github.com/jordonbiondo/bad03e44bb053db0f1eb คุณสามารถdescribe-hookกำหนดได้เหมือนฟังก์ชั่นอื่น ๆ อธิบาย นี่คือตัวอย่างผลลัพธ์ของมัน:

และนี่คือรหัสทั้งหมดในกรณีที่ส่วนสำคัญหายไป:

(defun guess-all-hooks ()
  "Return a list of all variables that are probably hook lists."
  (let ((syms '()))
    (mapatoms
     (lambda (sym)
       (if (ignore-errors (symbol-value sym))
           (let ((name (symbol-name sym)))
             (when (string-match "-\\(hook[s]?\\|functions\\)$" name)
               (push sym syms))))))
    syms))

(defun face-it (str face)
  "Apply FACE to STR and return."
  (propertize str 'face face))

(defun describe-hook (hook)
  "Display documentation about a hook variable and the
functions it contains."
  (interactive
   (list (completing-read
          "Hook: " (mapcar (lambda (x) (cons x nil)) (guess-all-hooks)))))
  (let* ((sym (intern hook))
         (sym-doc (documentation-property sym 'variable-documentation))
         (hook-docs (mapcar
                     (lambda (func)
                       (cons func (ignore-errors (documentation func))))
                     (symbol-value sym))))
    (switch-to-buffer
     (with-current-buffer (get-buffer-create "*describe-hook*")
       (let ((inhibit-read-only t))
         (delete-region (point-min) (point-max))
         (insert (face-it "Hook: " 'font-lock-constant-face) "\n\n")
         (insert (face-it (concat "`" hook "'") 'font-lock-variable-name-face))
         (replace-string "\n" "\n\t" nil
                         (point)
                         (save-excursion
                           (insert "\n" sym-doc "\n\n")
                           (1- (point))))
         (goto-char (point-max))
         (insert (face-it "Hook Functions: " 'font-lock-constant-face) "\n\n")
         (dolist (hd hook-docs)
           (insert (face-it (concat "`" (symbol-name (car hd)) "'")
                            'font-lock-function-name-face)
                   ": \n\t")
           (replace-string "\n" "\n\t" nil
                           (point)
                           (save-excursion
                             (insert (or (cdr hd) "No Documentation") "\n\n")
                             (1- (point))))
           (goto-char (point-max))))
       (help-mode)
       (help-make-xrefs)
       (read-only-mode t)
       (setq truncate-lines nil)
       (current-buffer)))))

หมายความว่าเมื่อฟังก์ชั่นได้รับการแนะนำเอกสารจะถูกอัพเดตโดยอัตโนมัติเพื่อสะท้อนการเปลี่ยนแปลงหรือไม่?
nispio

ฉันไม่ทราบว่าคุณสมบัติที่แท้จริงได้รับการปรับปรุง แต่ค่าที่ส่งคืนโดยdocumentationมีการปรับปรุงเพื่อสะท้อนให้เห็นถึง
Jordon Biondo

1
@nispio ใช่มันเป็น
Malabarba

1
รหัส / ฟังก์ชั่นใน gist.github.com/jordonbiondo/bad03e44bb053db0f1ebสามารถและในความคิดของฉันควรจะรวมอยู่ในคำตอบ ฉันคิดว่าคำตอบ SE มีจำนวนอักขระไม่เกิน 30,000 ตัว
Faheem Mitha

4

อาจไม่ใช่คำตอบที่สมบูรณ์สำหรับคำถามของคุณ แต่แพ็คเกจ helm-descbindsช่วยให้คุณค้นหาการผูกแป้นพิมพ์ที่กำหนดทั้งหมดจากการแทน ascii ของทางลัด ทุกครั้งมันจะแสดงฟังก์ชั่นการโต้ตอบที่เกี่ยวข้องกับแป้นพิมพ์ลัดและคุณสามารถขอhelm-descbindsให้อธิบายหรือดำเนินการโดยตรงจากผลการค้นหา

ป้อนคำอธิบายรูปภาพที่นี่

นี่คือคำอธิบายแพ็คเกจจากเว็บไซต์ GitHub:

Helm Descbinds จัดเตรียมอินเทอร์เฟซสำหรับการอธิบายการเชื่อมโยงของ emacs ทำให้การเชื่อมโยงคีย์ที่ใช้งานอยู่ในปัจจุบันสามารถค้นหาได้แบบโต้ตอบกับ helm

นอกจากนี้คุณมีการดำเนินการดังต่อไปนี้

  • ดำเนินการคำสั่ง
  • อธิบายคำสั่ง
  • ค้นหาคำสั่ง

และC-zจะให้คำอธิบายถาวรของคำสั่งปัจจุบัน


2
มันเยี่ยมมาก C-h bฉันจะแน่นอนผูกนี้ ความปรารถนาของฉันเท่านั้นคือว่าผมสามารถข้ามไปที่รายการในรายการโดยการป้อนลำดับที่สำคัญที่เกิดขึ้นจริงแทนการพิมพ์ออกC - c _ C - p
nispio
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.