Utilisez deux cartes en mode majeur dans le même tampon

11

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-modecommandes facilement disponibles lors de l'édition org-mode.
  • Je fréquente une salle irc avec prise en charge de Markdown, donc ce serait bien d'avoir des markdown-moderaccourcis clavier ajoutés erc-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-modeclés. Ce que je veux, c'est:
si une clé est définie dans latex-mode-mapET elle n'est pas définie dans org-mode-mapalors utilisez la latex-mode-mapliaison .

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.

Malabarba
la source
6
Utilisez une fusion de keymap. Tu vois make-composed-keymap.
Drew

Réponses:

12

Cela s'est avéré plus simple que prévu. Comme suggéré dans les commentaires ici et sur la question:

(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)))

Cela créera une image clé qui est une copie de erc-mode-mapmais qui hérite également de markdown-mode-map. Ainsi, toutes les markdownclés seront masquées lorsqu'elles entrent en collision avec des ercclés.

Si vous ne voulez quelques clés du keymap de secours à éclipser la principale Kemap, il suffit de les désactiver dans principal.

(define-key erc-mode-map "\C-c\C-a" nil)
Malabarba
la source
2
J'ai remarqué que l'utilisation define-keyde la valeur de retour de make-composed-keymappeut avoir des effets secondaires inattendus sur les keymaps d'origine, et je pense que la même chose pourrait s'appliquer à cette appendedcarte manuellement . Si vous souhaitez utiliser define-key, il semble plus sûr de créer un nouveau clavier dont le clavier parent est un clavier composé.
Jon O.
@JonO. En fait, j'ai été très surpris de découvrir que cela ne se produit pas ici. Si je le fais (define-key erc-mode-map "\C-c\C-s" nil), la markdown-modeclé correspondante sera toujours disponible même dans les tampons erc.
Malabarba
Malabarba: Je pense que votre dernier commentaire ne s'applique plus après ce changement de code. La make-composed-keymapdocumentation 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." Comme markdown-mode-mapPARENT dans votre exemple, je m'attendrais à ce que la nilliaison inhibe la liaison de démarque?
phils
2
Mon interprétation est que (make-composed-keymap (list erc-mode-map markdown-mode-map)) cela aurait l'effet que vous avez décrit, cependant?
phils
1
cl-copy-listne fera pas vraiment ce que vous voulez. Si vous vouliez copier le clavier, alors vous auriez dû utiliser copy-keymap.
Stefan
3

Comme mentionné par @Malabarba, vous pouvez l'utiliser make-composed-keymappour 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:

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

En effet, il est define-keyparfois possible de modifier les mappes passées en premier argument make-composed-keymapmais pas celles passées en deuxième. Je suppose que vous devriez le faire M-x report-emacs-buget demander à make-composed-keymapaccepter une liste de keymaps comme deuxième argument, de sorte que vous puissiez simplement faire

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