bind-map เป็นแพ็คเกจของ Emacs ที่ให้มาโคร bind-map
ซึ่งสามารถใช้เพื่อทำให้คีย์แมปพร้อมใช้งานสำหรับ "คีย์ผู้นำ" ที่แตกต่างกัน รวมถึงคีย์ที่เชื่อมโยงกับสถานะที่ชั่วร้าย โดยพื้นฐานแล้วมันเป็นภาพรวมของแนวคิดของคีย์ผู้นำที่ใช้ในกลุ่มหรือแพ็คเกจ Emacs evil-leader และอนุญาตให้มี "คีย์ผู้นำ" ตามจำนวนที่ต้องการ นี่อาจอธิบายได้ดีที่สุดด้วยตัวอย่าง
(bind-map my-base-leader-map
:keys ( " M-m " )
:evil-keys ( " SPC " )
:evil-states (normal motion visual))
(bind-map my-elisp-map
:keys ( " M-m m " " M-RET " )
:evil-keys ( " SPC m " " , " )
:major-modes ( emacs-lisp-mode
lisp-interaction-mode))
สิ่งนี้จะทำให้ my-base-leader-map
(สร้างแผนที่โดยอัตโนมัติหากยังไม่ได้กำหนด) พร้อมใช้งานภายใต้คำนำหน้า (หรือผู้นำ) Mm
และ SPC
โดยที่ส่วนหลังถูกผูกไว้เฉพาะในสภาวะปกติ การเคลื่อนไหว หรือการมองเห็นของปีศาจเท่านั้น การประกาศครั้งที่สองทำให้ my-elisp-map
พร้อมใช้งานภายใต้คีย์ที่ระบุ เมื่อโหมดหลักที่ระบุอย่างใดอย่างหนึ่งทำงานอยู่ ในกรณีที่สอง สถานะชั่วร้ายที่ใช้ก็เป็นการเคลื่อนไหวและการมองเห็นปกติเช่นกัน เนื่องจากนี่เป็นค่าเริ่มต้นตามที่ระบุไว้ใน bind-map-default-evil-states
เป็นไปได้ที่จะทำให้การเชื่อมโยงมีเงื่อนไขในโหมดรองที่กำลังโหลด หรือผสมระหว่างโหมดหลักและโหมดรอง เนื่องจากมีการใช้สัญลักษณ์ของโหมด จึงไม่จำเป็นต้องตรวจสอบให้แน่ใจว่าแพ็คเกจใดๆ ของโหมดถูกโหลดก่อนที่จะมีการประกาศนี้ ดูเอกสารของ bind-map
สำหรับตัวเลือกเพิ่มเติม
แพ็คเกจนี้จะใช้ประโยชน์จากความชั่วร้ายก็ต่อเมื่อมีการระบุคำหลักที่เกี่ยวข้องกับความชั่วร้ายอย่างใดอย่างหนึ่ง ตัวอย่างเช่น การประกาศนี้ไม่ได้ใช้แพ็คเกจที่ชั่วร้าย
(bind-map my-elisp-map
:keys ( " M-m m " " M-RET " )
:major-modes ( emacs-lisp-mode
lisp-interaction-mode))
แนวคิดเบื้องหลังแพ็คเกจนี้คือคุณต้องการจัดระเบียบการเชื่อมโยงส่วนบุคคลของคุณในชุดคีย์แมปแยกจากแมปโหมดในตัว คุณสามารถเพิ่มคีย์โดยใช้ define-key
ในตัวให้กับ my-elisp-map
ได้ และการประกาศเหมือนกับที่กล่าวข้างต้นจะช่วยดูแลให้แน่ใจว่าการเชื่อมโยงเหล่านี้มีอยู่ในตำแหน่งที่ถูกต้อง
คุณสามารถใช้ define-key
ในตัวซึ่งจะทำงานตามที่ตั้งใจไว้ bind-key
(ส่วนหนึ่งของ use-package) เป็นอีกทางเลือกหนึ่ง สำหรับผู้ที่ต้องการอินเทอร์เฟซที่แตกต่างกัน คุณอาจใช้คีย์เวิร์ด :bindings
ในมาโคร bind-map
หรือฟังก์ชันที่มีให้สองฟังก์ชัน bind-map-set-keys
และ bind-map-set-key-defaults
ซึ่งทั้งสองใช้เพียงแค่ define-key
ภายใน แต่อนุญาตให้มีการผูกหลายรายการโดยไม่มีไวยากรณ์มากนัก
(bind-map my-base-leader-map
:keys ( " M-m " )
:evil-keys ( " SPC " )
:evil-states (normal motion visual)
:bindings ( " c " 'compile
" C " 'check ))
(bind-map-set-keys my-base-leader-map
" c " 'compile
" C " 'check
; ; ...
)
; ; is the same as
; ; (define-key my-base-leader-map (kbd "c") 'compile)
; ; (define-key my-base-leader-map (kbd "C") 'check)
; ; ...
(bind-map-set-key-defaults my-base-leader-map
" c " 'compile
; ; ...
)
; ; is the same as
; ; (unless (lookup-key my-base-leader-map (kbd "c"))
; ; (define-key my-base-leader-map (kbd "c") 'compile))
; ; ...
ฟังก์ชันที่สองจะเพิ่มการผูกข้อมูลเฉพาะในกรณีที่ไม่มีการผูกข้อมูลสำหรับคีย์นั้น อาจมีประโยชน์เฉพาะสำหรับการกำหนดค่าที่ใช้ร่วมกัน โดยที่คุณต้องการจัดให้มีการเชื่อมโยงเริ่มต้น แต่ไม่ต้องการให้การเชื่อมโยงนั้นเขียนทับการเชื่อมโยงที่ทำโดยผู้ใช้ โปรดทราบว่าคีย์ในทั้งสองฟังก์ชันคือสตริงที่ส่งผ่านไปยัง kbd
ก่อนที่จะรวมเข้าด้วยกัน
หากคุณใช้การประกาศ bind-map
หลายรายการ คุณอาจพบว่าตัวเองใช้คุณสมบัติซ้ำ เช่น :evil-keys
และ :evil-states
คุณสามารถใช้ bind-map-for-mode-inherit
เพื่อดึงคุณสมบัติเหล่านี้จากแมปพาเรนต์โดยอัตโนมัติตามตัวอย่างต่อไปนี้ ดูเอกสารสำหรับข้อมูลเพิ่มเติม
(bind-map my-leader-map
:keys ( " M-m " )
:evil-keys ( " SPC " )
:evil-states (normal motion visual))
(bind-map-for-mode-inherit my-markdown-map my-leader-map
:major-modes ( markdown-mode ))