J'ai rencontré quelques situations où il serait très pratique de devoir faire en sorte que le clavier d'un mode principal agisse comme un clavier de secours pour un autre mode principal. Par exemple:
- J'écris beaucoup de LaTeX dans certains de mes documents d'organisation, donc ce serait génial d'avoir des
latex-mode
commandes facilement disponibles lors de l'éditionorg-mode
. - Je fréquente une salle irc avec prise en charge de Markdown, donc ce serait bien d'avoir des
markdown-mode
raccourcis clavier ajoutéserc-mode
.
Dans les deux cas , cette keymap supplémentaire devrait agir comme fallback (ce pourquoi je ne peux pas utiliser un mode mineur pour cela). Je ne veux pas que les commandes latex remplacent les org-mode
clés. Ce que je veux, c'est:
si une clé est définie dans latex-mode-map
ET elle n'est pas définie dans
org-mode-map
alors utilisez la latex-mode-map
liaison .
Q: Comment puis-je définir une carte-clé comme carte-clé de secours pour un mode principal?
OU
Q: Comment peut-on copier des clés d'une carte en mode principal à une autre, sans rien remplacer?
Juste pour être clair. Je sais que je pourrais définir ces clés une par une, mais il serait infiniment plus pratique d'avoir une solution automatisée.
la source
make-composed-keymap
.Réponses:
Cela s'est avéré plus simple que prévu. Comme suggéré dans les commentaires ici et sur la question:
Cela créera une image clé qui est une copie de
erc-mode-map
mais qui hérite également demarkdown-mode-map
. Ainsi, toutes lesmarkdown
clés seront masquées lorsqu'elles entrent en collision avec deserc
clés.Si vous ne voulez quelques clés du keymap de secours à éclipser la principale Kemap, il suffit de les désactiver dans principal.
la source
define-key
de la valeur de retour demake-composed-keymap
peut avoir des effets secondaires inattendus sur les keymaps d'origine, et je pense que la même chose pourrait s'appliquer à cetteappended
carte manuellement . Si vous souhaitez utiliserdefine-key
, il semble plus sûr de créer un nouveau clavier dont le clavier parent est un clavier composé.(define-key erc-mode-map "\C-c\C-s" nil)
, lamarkdown-mode
clé correspondante sera toujours disponible même dans les tampons erc.make-composed-keymap
documentation indique "une liaison nulle dans MAPS remplace toute liaison correspondante dans PARENT, mais elle ne remplace pas les liaisons correspondantes dans d'autres images clés de MAPS." Commemarkdown-mode-map
PARENT dans votre exemple, je m'attendrais à ce que lanil
liaison inhibe la liaison de démarque?(make-composed-keymap (list erc-mode-map markdown-mode-map))
cela aurait l'effet que vous avez décrit, cependant?cl-copy-list
ne fera pas vraiment ce que vous voulez. Si vous vouliez copier le clavier, alors vous auriez dû utilisercopy-keymap
.Comme mentionné par @Malabarba, vous pouvez l'utiliser
make-composed-keymap
pour cela. Mais si vous voulez vraiment que le nouveau keymap hérite des deux keymaps, tel que la modification du nouveau keymap n'affecte aucun des deux autres keymaps, vous devez le faire en deux étapes:En effet, il est
define-key
parfois possible de modifier les mappes passées en premier argumentmake-composed-keymap
mais pas celles passées en deuxième. Je suppose que vous devriez le faireM-x report-emacs-bug
et demander àmake-composed-keymap
accepter une liste de keymaps comme deuxième argument, de sorte que vous puissiez simplement fairela source