bind-map 是一个提供宏bind-map
Emacs 包,它可用于使键盘映射在不同的“引导键”(包括与邪恶状态相关的键)上可用。它本质上是 vim 或 Emacs 邪恶领导者包中使用的领导者密钥概念的概括,并允许任意数量的“领导者密钥”。这可能最好用一个例子来解释。
(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
(使用包的一部分)是另一种选择。对于那些想要不同接口的人,您可以在bind-map
宏中使用:bindings
关键字,或者使用提供的两个函数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 ))