Já deparei com algumas situações em que seria altamente conveniente que o mapa de teclas de um modo principal atue como um mapa de teclas de fallback para outro modo principal. Por exemplo:
- Eu escrevo muito LaTeX em alguns dos meus documentos organizacionais, por isso seria ótimo ter
latex-mode
comandos disponíveis facilmente durante a ediçãoorg-mode
. - Eu frequento uma sala de irc com suporte ao Markdown, por isso também seria bom
markdown-mode
adicionar teclas de atalhoerc-mode
.
Nos dois casos, este mapa de teclas extra deve funcionar como um substituto (é por isso que não posso usar apenas um modo secundário para isso). Não quero que os comandos de látex substituam nenhuma org-mode
chave. O que eu quero é:
Se uma chave estiver definida em latex-mode-map
AND, não estiver definida
org-mode-map
, use a latex-mode-map
ligação .
P: Como posso definir um mapa de teclas como um mapa de teclas de fallback para um modo principal?
OU
P: Como copiar chaves de um mapa de modo principal para outro, sem substituir nada?
Só para ficar claro. Eu sei que poderia definir essas chaves uma por uma, mas seria infinitamente mais conveniente ter uma solução automatizada.
fonte
make-composed-keymap
.Respostas:
Isso acabou sendo mais simples do que o esperado. Como sugerido nos comentários aqui e na pergunta:
Isso criará um mapa de chaves que é uma cópia,
erc-mode-map
mas que também herdamarkdown-mode-map
. Portanto, todas asmarkdown
chaves serão sombreadas sempre que colidirem com elaserc
.Se você não quer algumas chaves do keymap fallback para ofuscar o kemap principal, apenas desativá-los em um principal.
fonte
define-key
do valor de retorno demake-composed-keymap
pode ter efeitos colaterais inesperados nos mapas de teclas originais, e suspeito que o mesmo possa se aplicar a esseappended
mapa manualmente . Se você deseja usardefine-key
, parece mais seguro criar um novo mapa de teclas cujo mapa de teclas pai é um mapa de teclas composto.(define-key erc-mode-map "\C-c\C-s" nil)
, amarkdown-mode
chave correspondente ainda estará disponível, mesmo nos buffers erc.make-composed-keymap
documentação diz que "uma ligação nula no MAPS substitui qualquer ligação correspondente no PARENT, mas não substitui as ligações correspondentes em outros mapas principais do MAPS". Comomarkdown-mode-map
PARENT no seu exemplo, eu esperaria que essanil
ligação inibisse a ligação de remarcação?(make-composed-keymap (list erc-mode-map markdown-mode-map))
teria o efeito que você descreveu, no entanto?cl-copy-list
realmente não fará o que você quiser. Se você deseja copiar o mapa de teclas, deveria ter usadocopy-keymap
.Como mencionado por @Malabarba, você pode usar
make-composed-keymap
para isso. Mas se você realmente deseja que o novo mapa de chaves seja herdado dos dois mapas de teclas, a modificação do novo mapa de teclas não afeta nenhum dos outros dois mapas de teclas, mas é necessário fazê-lo em duas etapas:Isso ocorre porque
define-key
às vezes pode modificar os mapas passados como primeiro argumento,make-composed-keymap
mas não aqueles passados como segundo. Eu acho que você deveM-x report-emacs-bug
e solicita quemake-composed-keymap
aceite uma lista de keymaps como segundo argumento, para que você possa fazerfonte