Por que esse código falha ao anular todas as combinações de teclas em um mapa de teclas?

7

Para encurtar a história, há uma pequena biblioteca de que eu gosto, mas não gosto de nenhuma das combinações de teclas padrão. Por exemplo, é um modo secundário global e vincula uma função C-c C-s, mas isso sombreia org-schedulena minha organização e nos buffers da agenda organizacional.

Eu quero manter a pequena biblioteca, mas me livrar de todas as ligações no mapa de teclas da pequena biblioteca.

Em uma tentativa inicial de fazer isso, tentei o seguinte (depois de confirmar que little-library-mode-mapé onde as ligações vivem):

(with-eval-after-load "little-library-mode"
  (setq little-library-mode-map (make-sparse-keymap)))

O código "é bem-sucedido" ( C-h v little-library-mode-map RETmostra que é (keymap)agora), mas todos os atalhos de teclado da pequena biblioteca ainda "funcionam" ( C-c C-sainda funciona com a pequena biblioteca, inclusive nos buffers de organização e agenda organizacional).

Encontrei outra maneira de resolver meu problema, mas estou realmente curioso para saber por que essa abordagem falha. As teclas de atalho do Emacs ainda me parecem magia negra.

purple_arrows
fonte
Você precisará modificar destrutivamente a estrutura de dados que o modo secundário usa, como (setcdr little-library-mode-map nil).
wasamasa

Respostas:

3

Há três coisas importantes nesta história:

  • o mapa de teclas do modo secundário
  • seu nome
  • o mapa de teclas esparsa que você cria

Basicamente, o que você fez foi apontar o nome para o mapa de teclas esparsas, em vez do original, mas é tarde demais: o modo secundário usa o original.

YoungFrog
fonte
Ah, entendi. Quando você coloca dessa maneira, faz todo o sentido. Você sabe como o Emacs / o modo secundário encontra o mapa de teclas original? Em qual estrutura de dados ele se parece?
purple_arrows
3
@purple_arrows está o mapa de teclas original minor-mode-map-alist.
npostavs
2

Em algum momento, ao ativar little-library-modeo mapa de teclas armazenado na variável, little-library-mode-mapé adicionado minor-mode-map-alist:

(push (cons 'little-library-mode little-library-mode-map) minor-mode-map-alist)

O Emacs usa essa lista para procurar ligações de modo secundário. Quando você liga a variável little-library-mode-mapa um novo valor posteriormente, isso não tem efeito no mapa de teclas apontado minor-mode-map-alistpara. Conforme observado no comentário de @wasamasa, uma maneira de se livrar de todas as ligações neste mapa de teclas é alterando o mapa de teclas diretamente:

 (setcdr little-library-mode-map nil)

Outra maneira é redefinir o mapa de teclas antes de carregar a biblioteca:

(setq little-library-mode-map (make-sparse-keymap))
(with-eval-after-load "little-library-mode" 
    ...more-setup-code)

Se o modo secundário for bem comportado, isso evitará instanciar suas ligações também.

clemera
fonte