Como realmente desvincular TODOS os atalhos de teclado globais?

8

Eu apenas tentei

(set 'global-map (make-sparse-keymap))

mas a emissão C-hbainda mostra muita porcaria, especialmente na seção Ligações Globais :

Global Bindings:
key             binding
---             -------

C-@             set-mark-command
C-a             move-beginning-of-line
C-b             backward-char
C-d             delete-char
C-e             move-end-of-line
C-f             forward-char
C-g             keyboard-quit
C-h             help-command
TAB             indent-for-tab-command
C-k             kill-line
C-l             recenter-top-bottom
RET             newline
C-n             next-line
C-o             open-line
...             ...

e há muito mais por vir.

Eu gostaria de me livrar deles completamente. Como posso fazer isso em uma chamada de função simples? Eu gostaria que a solução fosse uma limpeza total, em vez de um loop no qual todos esses mapas estão sendo configurados nil. Agradeço antecipadamente.

NOTA: Por favor, nenhuma resposta de ensino ou comentários de spam como "Essas chaves são essenciais para a produtividade, não faça isso!" . Eu tenho uma camada de emulação altamente personalizada para edição de texto modal aqui, então não preciso dessas ligações padrão.

Alexander Shukaev
fonte
Estou curioso. O que há de errado com o evil-modefato de você ter que escrever sua própria camada de edição modal?
Tu Do
@Tu Do, sim evil-mode, mas algumas de suas funcionalidades de nível superior: operadores, objetos de texto e alguns comandos foram reescritos ou estendidos de alguma forma. Suas ligações padrão também foram totalmente apagadas e reorganizadas pelo teclado desde o início. No entanto, isso não tem nada a ver com a questão.
Alexander Shukaev
Eu só estava pedindo curiosidade. Mas obrigada.
Tu Do
Você provavelmente deve usar um mapa de teclas não esparso criado com make-keymap.
tarsius 26/11/14

Respostas:

16

Retirado do Emacs Lisp Manual (consulte Controlando mapas ativos ):

(use-global-map (make-sparse-keymap))

Para citar o manual: "É muito incomum alterar o mapa de teclas global.". Nota de segurança: Certifique-se de salvar os buffers e sair do Emacs de maneira limpa posteriormente com um mapa de teclas diferente; caso contrário, será necessário eliminá-lo sem alterações salvas.

wasamasa
fonte
Você é o cara!
Alexander Shukaev
6

Embora as informações a seguir não sejam uma resposta direta à pergunta (já que ela já foi respondida por @wasamasa), ainda acredito que seja uma adição essencial à resposta. O ponto é que, depois de emitir

(use-global-map (make-sparse-keymap))

alguém de fato apaga completamente a seção Ligações Globais e, como conseqüência, não se pode mais digitar texto! Na esmagadora maioria dos casos, é claro que alguém deseja restaurar a capacidade de digitar texto, pois é essencial para qualquer editor de texto. Portanto, aqui está a única maneira de fazer isso:

(global-set-key [t] #'self-insert-command)
(let ((c ?\s))
  (while (< c ?\d)
    (global-set-key (vector c) #'self-insert-command)
    (setq c (1+ c)))
  (when (eq system-type 'ms-dos)
    (setq c 128)
    (while (< c 160)
      (global-set-key (vector c) #'self-insert-command)
      (setq c (1+ c))))
  (setq c 160)
  (while (< c 256)
    (global-set-key (vector c) #'self-insert-command)
    (setq c (1+ c))))

Apenas para que vocês acreditem que esse código Emacs Lisp é a maneira correta de fazer isso, fornecerei a fonte que usei para produzi-lo. Por padrão, a capacidade de digitar texto com a página de código ASCII de 8 bits atual é implementada na cmds.cunidade de tradução do código-fonte Emacs C:

  for (n = 040; n < 0177; n++)
    initial_define_key (global_map, n, "self-insert-command");
#ifdef MSDOS
  for (n = 0200; n < 0240; n++)
    initial_define_key (global_map, n, "self-insert-command");
#endif
  for (n = 0240; n < 0400; n++)
    initial_define_key (global_map, n, "self-insert-command");

Como você pode ver, o código Emacs Lisp acima é a replicação exata desse código C, exceto por uma linha adicional:

(global-set-key [t] #'self-insert-command)

Considere uma ressalva, mas é importante ter essa linha ! Caso contrário, apenas 7 bits da página de código ASCII atual estariam disponíveis (independentemente do fato de termos inicializado todos os 8 bits).

Alexander Shukaev
fonte
3
Isso parece excessivamente complexo. Por que não copiar as self-insert-commandligações do mapa de teclas global atual? (setq my-global-map (make-keymap)) (substitute-key-definition 'self-insert-command 'self-insert-command my-global-map global-map)
Gilles 'SO- stop be evil' (
1
@Gilles, eu não vejo o que você acha complexo em 3 loops, mas fique à vontade para seguir seu caminho, se você já o testou. Além disso, este post é mais um valor educacional, para que as pessoas que desaparecem global-mapimediatamente saibam que problema enfrentarão e qual é a receita para resolvê-lo. Eles provavelmente aprenderão algo novo sobre o ASCII em geral e / ou como ele é implementado no Emacs em particular.
Alexander Shukaev