มีฟังก์ชั่นเพื่อแทรก `(kbd“ …”) ที่ถูกต้องโดยการกดปุ่มหรือไม่?


20

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

ตัวอย่างเช่นฉันต้องการทำสิ่งนี้: ฉันกำลังพิมพ์

(local-set-key |

ฉันวิ่งmagical-insert-kbd-commandกด f6 แล้วฉันจะได้

(local-set-key (kbd "<f6>") |

คำตอบ:


20

ไม่แน่ใจว่าสิ่งที่คุณถาม แต่C-h kตามด้วยการกดปุ่มจะแสดงให้คุณเห็นว่าคุณต้องการส่งผ่านสตริงkbdใด ยกตัวอย่างเช่นแสดงให้คุณเห็นC-h k f6<f6>

นี่คือคำสั่งที่ทำในสิ่งที่คุณต้องการฉันเดาและผูกผลลัพธ์C-c c:

(defun foo (key)
  (interactive "kKey: ")
  (insert (format "(kbd %S)" (key-description key))))

(global-set-key (kbd "C-c c") 'foo)

จากนั้นพิมพ์:

(local-set-key C-c c

ซึ่งจะแจ้งให้คุณใช้รหัส หากคุณกดF6ปุ่มคุณจะได้รับสิ่งนี้:

(local-set-key (kbd "<f6>") 

[อัปเดตต่อข้อเสนอแนะโดย @HaraldHancheOlsen: เปลี่ยน"(kbd \"%s\")"เป็น".](kbd %S)"


สมบูรณ์แบบขอบคุณ! สิ่งสำคัญที่ฉันขาดหายไปคือkey-descriptionฟังก์ชั่นที่ขาดหายไป
dshepherd

แต่ OP นั้นถูกต้องว่ามันจะมีประโยชน์ที่จะมีฟังก์ชั่นที่จะวางพวงกุญแจไว้ใน kill ring โดยอัตโนมัติ
ยอง

1
@incandescentman: หืม? OP พูดอะไรเกี่ยวกับแหวนสังหารที่ไหน? และคุณหมายถึงอะไรโดย "การผูกกุญแจ" ในประโยคนั้น? การโยงคีย์ไม่ใช่สตริงซึ่งเป็นสิ่งที่kill-ringมีอยู่ คุณหมายถึงkey-descriptionสตริงหรือไม่ หรือค่าตอบแทนของformatsexp ข้างต้น? อย่างไรก็ตามมันควรจะชัดเจนว่าจะแก้ไขคำสั่งที่ฉันให้ไว้เพื่อเพิ่มอย่างใดอย่างหนึ่งเหล่านั้นไปที่kill-ring(เพียงใช้kill-new)
Drew

"แทรกโดยอัตโนมัติ" หากฉันเข้าใจถูกต้องวิธีแก้ปัญหาด้านบนจะแสดงเฉพาะการเชื่อมโยงคีย์ (เช่นkbd <M-return>) แต่ไม่ได้แทรกลงในไฟล์ init (คุณต้องทำขั้นตอนเพิ่มเติมในการคัดลอก / วาง) บางทีฉันอาจเข้าใจผิด สำหรับกรณีการใช้งานส่วนตัวของฉันเองฉันจะพบว่ามีประโยชน์ที่จะมีวิธีสืบค้นไวยากรณ์สำหรับการโยงคีย์ (เช่นไวยากรณ์M-RETหรือM-<return>หรืออะไร?) และวางสตริงนั้นใน kill ring / pasteboard โดยอัตโนมัติเพื่อที่ฉันจะได้ วางปุ่มลัดลงในแฟ้ม init (define-key map (kbd "<M-return>") 'org-return)ของฉันเมื่อเขียนบรรทัดเช่น
ยอง

1
ใช่คุณเข้าใจผิด (แต่ก็มีการพิมพ์ผิดใน sexp ที่มีผลผูกพันคีย์: ฉันลืมที่จะใช้kbdในglobal-set-keysexp - แก้ไขในขณะนี้) คำสั่งfoo(ซึ่งglobal-set-keysexp ผูกไปC-c c) อ่านลำดับที่สำคัญแล้วแทรกที่จุดบัฟเฟอร์ปัจจุบันkbdsexp ที่เหมาะสมสำหรับมัน หากคุณใช้C-c cในไฟล์ init หลังจาก(local-set-key นั้นมันจะแทรกkbdsexp ที่คุณต้องการสำหรับรหัสที่อ่าน
Drew

7

หากคุณใช้M-x local-set-keyในการทำ keybinding ของคุณแบบโต้ตอบคุณสามารถใช้C-x ESC ESC( repeat-complex-command) เพื่อรับการแสดงออกเสียงกระเพื่อมที่คุณสามารถวางลงในการกำหนดค่าของคุณ มันอาจจะไม่ใช้(kbd ...)คำอธิบายสไตล์มิตร


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