ใช้สองโหมดหลักแผนที่ในบัฟเฟอร์เดียวกัน


11

ฉันพบสถานการณ์บางอย่างที่สะดวกสบายอย่างยิ่งที่จะต้องมี keymap ของหนึ่งในโหมดหลักที่ทำหน้าที่เป็นทางเลือกหลักสำหรับทางเลือกหลักอื่น ๆ ตัวอย่างเช่น

  • ผมเขียนจำนวนมากของน้ำยางในบางส่วนของเอกสารที่องค์กรของฉันดังนั้นมันจะดีที่จะมีคำสั่งอย่างที่มีอยู่ในขณะที่การแก้ไขlatex-mode org-mode
  • ฉันบ่อยห้อง IRC ด้วยการสนับสนุน Markdown ดังนั้นมันก็จะดีที่จะมีmarkdown-modekeybinds erc-modeเพิ่มไปยัง

ในทั้งสองกรณีคีย์แมปพิเศษนี้ควรทำหน้าที่เป็นทางเลือก (นี่คือสาเหตุที่ฉันไม่สามารถใช้โหมดรองสำหรับสิ่งนี้ได้) ฉันไม่ต้องการให้คำสั่งลาเท็กซ์แทนที่org-modeปุ่มใด ๆ สิ่งที่ฉันต้องการคือ
ถ้าคีย์ถูกกำหนดในlatex-mode-mapและมันไม่ได้กำหนดไว้ใน org-mode-mapจากนั้นใช้latex-mode-mapมีผลผูกพัน

ถาม:ฉันจะตั้งค่าคีย์แมปเป็นคีย์ลัดสำหรับโหมดหลักได้อย่างไร
หรือ
Q:จะสามารถคัดลอกคีย์จาก main-mode-map ไปยังที่อื่นได้อย่างไร


เพียงเพื่อให้ชัดเจน ฉันรู้ว่าฉันสามารถกำหนดปุ่มเหล่านี้ทีละหนึ่ง แต่มันจะสะดวกกว่าอนันต์ที่จะมีทางออกอัตโนมัติ


6
ใช้การผสานคีย์แมป make-composed-keymapดู
Drew

คำตอบ:


12

สิ่งนี้กลายเป็นเรื่องง่ายกว่าที่คาดไว้ ตามที่แนะนำในความคิดเห็นที่นี่และคำถาม:

(with-eval-after-load 'erc
  (require 'markdown-mode)
  (require 'cl-lib)
  (setq erc-mode-map
        (make-composed-keymap (cl-copy-list erc-mode-map)
                              markdown-mode-map)))

นี้จะสร้างรูปแบบแป้นซึ่งเป็นสำเนาที่แต่ที่ยังสืบทอดมาจากerc-mode-map markdown-mode-mapดังนั้นmarkdownคีย์ทั้งหมดจะเป็นเงาเมื่อใดก็ตามที่พวกเขาชนกับercคีย์

หากคุณไม่ต้องการคีย์ของ keymap สำรองบางส่วนเพื่อ outshine kemap หลักเพียงแค่ปิดการใช้งานพวกเขาในหนึ่งหลัก

(define-key erc-mode-map "\C-c\C-a" nil)

2
ฉันสังเกตเห็นว่าการใช้define-keyกับค่าส่งคืนของmake-composed-keymapสามารถมีผลข้างเคียงที่ไม่คาดคิดบนปุ่มกดดั้งเดิมและฉันสงสัยว่าอาจนำไปใช้กับappendedแผนที่นี้ด้วยตนเอง หากคุณต้องการใช้define-keyดูเหมือนว่าจะปลอดภัยที่สุดในการสร้าง keymap ใหม่ซึ่งparentmap หลักคือ keymap ที่ประกอบขึ้น
Jon O.

@JonO ที่จริงฉันรู้สึกประหลาดใจมากที่พบว่าสิ่งนี้ไม่ได้เกิดขึ้นที่นี่ ถ้าฉันทำรหัส(define-key erc-mode-map "\C-c\C-s" nil)ที่เกี่ยวข้องmarkdown-modeจะยังคงใช้ได้แม้จะอยู่ในบัฟเฟอร์ erc
Malabarba

Malabarba: ฉันเชื่อว่าความคิดเห็นสุดท้ายของคุณไม่สามารถใช้งานได้อีกหลังจากเปลี่ยนรหัสแล้ว make-composed-keymapเอกสารกล่าวว่า "ไม่มีผลผูกพันในแผนที่แทนที่ใด ๆ ที่เกี่ยวข้องที่มีผลผูกพันใน PARENT แต่มันไม่แทนที่ผูกใน keymaps อื่น ๆ ของแผนที่สอดคล้องกัน." ในฐานะที่markdown-mode-mapเป็นผู้ปกครองในตัวอย่างของคุณฉันคาดหวังว่าการnilผูกเพื่อยับยั้งการรวมมาร์คดาวน์
phils

2
การตีความของฉันคือว่า(make-composed-keymap (list erc-mode-map markdown-mode-map)) จะมีผลกระทบที่คุณอธิบายได้อย่างไร
phils

1
cl-copy-listจะไม่ทำสิ่งที่คุณต้องการจริงๆ copy-keymapหากคุณต้องการที่จะคัดลอกรูปแบบแป้นแล้วคุณควรจะใช้
Stefan

3

ตามที่กล่าวไว้โดย @Malabarba คุณสามารถใช้make-composed-keymapสิ่งนั้นได้ แต่ถ้าคุณต้องการให้คีย์แมปใหม่สืบทอดจากทั้งสองคีย์แม็พเช่นการแก้ไขคีย์แม็พใหม่นั้นจะไม่ส่งผลกระทบต่อทั้งสองคีย์แม็พอื่น ๆ คุณต้องดำเนินการในสองขั้นตอน:

(make-composed-keymap
 nil (make-composed-keymap (list erc-mode-map markdown-mode-map)))

นี่เป็นเพราะdefine-keyบางครั้งสามารถแก้ไขแผนที่ที่ส่งผ่านเป็นอาร์กิวเมนต์แรกmake-composed-keymapแต่ไม่ใช่ว่าผ่านไปเป็นครั้งที่สอง ฉันเดาว่าคุณควรM-x report-emacs-bugและขอให้make-composed-keymapยอมรับรายการ keymaps เป็นอาร์กิวเมนต์ที่สองดังนั้นคุณสามารถทำได้

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