Comment vraiment dissocier TOUS les raccourcis clavier mondiaux?

8

Je viens d'essayer

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

mais l'émission C-hbmontre toujours des tonnes de merde, en particulier dans la section Global Bindings :

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
...             ...

et il y en a tellement d'autres à venir.

Je voudrais m'en débarrasser complètement. Comment puis-je éventuellement faire cela en un seul appel de fonction? Je voudrais que la solution soit un effacement total, plutôt qu'une boucle qui définit toutes ces cartes nil. Merci d'avance.

REMARQUE: s'il vous plaît, aucune réponse pédagogique ou commentaire de spam comme "Ces clés sont essentielles pour la productivité, ne faites pas ça!" . J'ai ici une couche d'émulation hautement personnalisée pour l'édition de texte modal, donc je n'ai pas du tout besoin de ces liaisons par défaut.

Alexander Shukaev
la source
Je suis curieux. Quel est le problème avec evil-modecela que vous devez écrire votre propre couche d'édition modale?
Tu Do
@Tu Do, c'est le cas evil-mode, mais certaines de ses fonctionnalités de haut niveau: opérateurs, objets texte et certaines commandes ont été réécrites ou étendues d'une manière ou d'une autre. Ses liaisons par défaut ont également été totalement effacées et réorganisées sur le clavier dès le début. Cela n'a cependant rien à voir avec la question.
Alexander Shukaev
Je demandais juste de la curiosité. Mais merci.
Tu Do
Vous devriez probablement utiliser un clavier non clairsemé créé avec make-keymap.
tarsius

Réponses:

16

Extrait du manuel Emacs Lisp (voir Contrôle des cartes actives ):

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

Pour citer le manuel: "Il est très inhabituel de changer le clavier global.". Remarque de sécurité: assurez-vous que vous pouvez enregistrer les tampons et quitter proprement Emacs avec une autre carte de touches, sinon vous devrez le tuer sans modifications enregistrées.

wasamasa
la source
Tu es l'homme!
Alexander Shukaev
6

Bien que les informations suivantes ne soient pas une réponse directe à la question (car elle a déjà été répondue par @wasamasa), je pense toujours que c'est un ajout essentiel à la réponse. Le fait est qu'après avoir délivré

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

en effet, on efface complètement la section Global Bindings , et par conséquent, on ne peut même plus taper de texte! Dans une écrasante majorité des cas, on voudra bien sûr restaurer la capacité de taper du texte car il est de toute façon essentiel pour tout éditeur de texte. Voici donc la seule façon de procéder:

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

Juste pour que vous croyiez que ce code Emacs Lisp est une façon correcte de le faire, je vais fournir la source que j'ai utilisée pour le produire. Par défaut, la possibilité de taper du texte avec la page de code ASCII 8 bits actuelle est implémentée dans l' cmds.cunité de traduction du code source 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");

Comme vous pouvez le voir, le code Emacs Lisp ci-dessus est la réplication exacte de ce code C, à l'exception d'une ligne supplémentaire:

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

Considérez cela comme une mise en garde, mais cette ligne est importante à avoir! Sinon, seuls 7 bits de la page de codes ASCII actuelle seraient disponibles (indépendamment du fait que nous ayons initialisé tous les 8 bits).

Alexander Shukaev
la source
3
Cela semble excessivement complexe. Pourquoi ne pas copier les self-insert-commandliaisons depuis le clavier global actuel? (setq my-global-map (make-keymap)) (substitute-key-definition 'self-insert-command 'self-insert-command my-global-map global-map)
Gilles 'SO- arrête d'être méchant'
1
@ Gilles, je ne vois pas ce que vous trouvez complexe en 3 boucles, mais n'hésitez pas à aller votre chemin si vous l'avez déjà testé. En outre, ce message a plus de valeur éducative, de sorte que les personnes qui s'effacent global-mapsavent immédiatement à quel problème ils vont faire face et quelle est la recette pour le résoudre. Ils apprendront probablement quelque chose de nouveau sur ASCII en général et / ou comment il est implémenté dans Emacs en particulier.
Alexander Shukaev