bind-map est un package Emacs fournissant la macro bind-map
qui peut être utilisée pour rendre un keymap disponible sur différentes « clés principales », y compris celles liées à des états maléfiques. Il s'agit essentiellement d'une généralisation de l'idée d'une clé leader telle qu'utilisée dans vim ou dans le package evil-leader d'Emacs, et permet un nombre arbitraire de « clés leader ». Ceci est probablement mieux expliqué avec un exemple.
(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))
Cela rendra my-base-leader-map
(créant automatiquement la carte si elle n'est pas encore définie) disponible sous les préfixes (ou leaders) Mm
et SPC
, où ce dernier n'est lié que dans les états normaux, de mouvement ou visuels du mal. La deuxième déclaration rend my-elisp-map
disponible sous les clés spécifiées lorsque l'un des modes majeurs spécifiés est actif. Dans le deuxième cas, les états pervers utilisés sont également le mouvement normal et le visuel car il s'agit de la valeur par défaut spécifiée dans bind-map-default-evil-states
. Il est possible de conditionner les liaisons au chargement des modes mineurs, ou à un mélange de modes majeurs et mineurs. Puisque les symboles des modes sont utilisés, il n'est pas nécessaire de s'assurer que l'un des packages du mode soit chargé avant cette déclaration. Voir la docstring de bind-map
pour plus d'options.
Ce package n'utilisera evil que si l'un des mots-clés associés à evil est spécifié. Cette déclaration, par exemple, n'utilise pas le package evil.
(bind-map my-elisp-map
:keys ( " M-m m " " M-RET " )
:major-modes ( emacs-lisp-mode
lisp-interaction-mode))
L'idée derrière ce package est que vous souhaitez organiser vos liaisons personnelles dans une série de mappages de touches distincts des mappages du mode intégré. Vous pouvez simplement ajouter des clés en utilisant la define-key
intégrée à my-elisp-map
par exemple, et une déclaration comme celle ci-dessus veillera à garantir que ces liaisons sont disponibles aux bons endroits.
Vous pouvez utiliser la define-key
intégrée qui fonctionnera comme prévu. bind-key
(qui fait partie de use-package) est une autre option. Pour ceux qui souhaitent une interface différente, vous pouvez soit utiliser le mot-clé :bindings
dans la macro bind-map
, soit les deux fonctions fournies bind-map-set-keys
et bind-map-set-key-defaults
, qui utilisent toutes deux simplement define-key
en interne, mais autorise plusieurs liaisons sans beaucoup de syntaxe.
(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))
; ; ...
La deuxième fonction ajoute uniquement les liaisons s'il n'existe aucune liaison existante pour cette clé. Cela n'est probablement utile que pour les configurations partagées, dans lesquelles vous souhaitez fournir une liaison par défaut mais ne souhaitez pas que cette liaison écrase celle créée par l'utilisateur. Notez que les clés des deux fonctions sont des chaînes qui sont transmises à kbd
avant de les lier.
Si vous utilisez plusieurs déclarations bind-map
vous pourriez vous retrouver à répéter des propriétés telles que :evil-keys
et :evil-states
. Vous pouvez utiliser bind-map-for-mode-inherit
pour extraire automatiquement ces propriétés d'une carte parent, comme l'illustre l'exemple suivant. Voir la docstring pour plus d'informations.
(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 ))