Zetknąłem się z kilkoma sytuacjami, w których bardzo wygodnie byłoby mieć mapę kluczową jednego trybu głównego działającą jako mapa zapasowa dla innego trybu głównego. Na przykład:
- Piszę dużo LaTeX-a w niektórych moich dokumentach organizacyjnych, więc świetnie byłoby mieć
latex-mode
łatwo dostępne polecenia podczas edycjiorg-mode
. - Często odwiedzam IRC z obsługą Markdown, więc fajnie byłoby też
markdown-mode
dodać skróty klawiszoweerc-mode
.
W obu przypadkach ta dodatkowa mapa klawiszy powinna działać jako rezerwowa (dlatego nie mogę po prostu użyć do tego trybu mniejszego). Nie chcę, aby polecenia lateksu zastępowały jakiekolwiek org-mode
klawisze. Chcę, aby:
Jeśli klucz jest zdefiniowany w latex-mode-map
AND i nie jest zdefiniowany w,
org-mode-map
użyj latex-mode-map
powiązania .
P: Jak ustawić mapę klawiszy jako mapę zastępczą dla trybu głównego?
LUB
P: W jaki sposób można skopiować klucze z jednej mapy trybu głównego na inny, nie zastępując niczego?
Żeby było jasne. Wiem, że mógłbym zdefiniować te klucze jeden po drugim, ale nieskończenie wygodniej byłoby mieć zautomatyzowane rozwiązanie.
źródło
make-composed-keymap
.Odpowiedzi:
Okazało się to prostsze niż się spodziewano. Jak sugerowano w komentarzach tutaj i na pytaniu:
Spowoduje to utworzenie mapy klawiszy, która jest kopią,
erc-mode-map
ale z której również dziedziczymarkdown-mode-map
. Dlatego wszystkiemarkdown
klucze będą zasłaniane za każdym razem, gdy zderzą się zerc
kluczami.Jeśli chcesz , aby niektóre klucze mapy zastępczej przyćmiały główny kemap, po prostu wyłącz je w głównym.
źródło
define-key
zwracanej wartościmake-composed-keymap
może mieć nieoczekiwane skutki uboczne w oryginalnych mapach klawiszy i podejrzewam, że to samo może dotyczyć tejappended
mapy ręcznie . Jeśli chcesz użyćdefine-key
, wydaje się, że najbezpieczniej jest utworzyć nową mapę klawiszy, której mapa nadrzędna jest klawiaturą złożoną.(define-key erc-mode-map "\C-c\C-s" nil)
, odpowiednimarkdown-mode
klucz będzie nadal dostępny, nawet w buforach erc.make-composed-keymap
Dokumentacja mówi „a nil wiąże w MAPS zastępuje dowolny odpowiadający wiąże w rodzicem, ale nie zastępują odpowiadające wiązania w innych keymaps map.” Podobnie jakmarkdown-mode-map
w twoim przykładzie PARENT, oczekiwałbym, że tonil
wiązanie powstrzyma wiązanie przeceny?(make-composed-keymap (list erc-mode-map markdown-mode-map))
byłaby taka, jak byście opisali efekt?cl-copy-list
tak naprawdę nie zrobi tego, co chcesz. Jeśli chcesz skopiować mapę klawiszy, powinieneś był użyćcopy-keymap
.Jak wspomniano @Malabarba, możesz
make-composed-keymap
do tego użyć . Ale jeśli naprawdę chcesz, aby nowa mapa klawiszy odziedziczyła po obu mapach klawiszy, takie modyfikowanie nowej mapy klawiszy nie wpływa na żadną z pozostałych dwóch map klawiszy, musisz to zrobić w dwóch krokach:Wynika to z faktu, że
define-key
czasami można modyfikować mapy przekazane jako pierwszy argument,make-composed-keymap
ale nie te przekazane jako drugi. Myślę, że powinieneśM-x report-emacs-bug
i poprosić omake-composed-keymap
zaakceptowanie listy map klawiszy jako drugiego argumentu, więc możesz to zrobićźródło