¿Cómo desenredar realmente TODAS las combinaciones de teclas globales?

8

Acabo de intentar

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

pero la emisión C-hbaún muestra toneladas de basura, especialmente en la sección Enlaces globales :

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

Y hay muchos más por venir.

Me gustaría deshacerme de estos por completo. ¿Cómo puedo hacer eso en una simple llamada de función? Me gustaría que la solución sea una eliminación total, en lugar de un bucle que está configurando todos estos mapas nil. Gracias de antemano.

NOTA: Por favor, no hay respuestas de enseñanza o comentarios de spam como "Estas claves son esenciales para la productividad, ¡no lo hagas!" . Aquí tengo una capa de emulación altamente personalizada para la edición de texto modal, por lo que no necesito estos enlaces predeterminados en absoluto.

Alexander Shukaev
fuente
Soy curioso. ¿Qué tiene de malo evil-modeque tengas que escribir tu propia capa de edición modal?
Tu Do
@Tu Do, lo es evil-mode, pero algunas de sus funciones de nivel superior: operadores, objetos de texto y algunos comandos se reescribieron o ampliaron de alguna manera. Sus enlaces predeterminados también se eliminaron por completo y se reorganizaron a través del teclado desde el principio. Sin embargo, esto no tiene nada que ver con la pregunta.
Alexander Shukaev
Solo estaba pidiendo curiosidad. Pero gracias.
Tu Do
Probablemente debería usar un mapa de teclas no disperso creado con make-keymap.
tarsius

Respuestas:

16

Tomado del Manual Emacs Lisp (ver Control de mapas activos ):

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

Para citar el manual: "Es muy inusual cambiar el mapa de teclas global". Nota de seguridad: asegúrese de poder guardar búferes y salir limpiamente de Emacs después con un mapa de teclas diferente, de lo contrario, tendrá que eliminarlo sin guardar los cambios.

wasamasa
fuente
¡Eres el hombre!
Alexander Shukaev
6

Aunque la siguiente información no es una respuesta directa a la pregunta (ya que fue respondida por @wasamasa), sigo creyendo que es una adición esencial a la respuesta. El punto es que después de emitir

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

de hecho, uno elimina la sección de Enlaces globales por completo, y como consecuencia, ¡ ya ni siquiera puede escribir texto! En la abrumadora mayoría de los casos, uno, por supuesto, querría restaurar la capacidad de escribir texto, ya que es esencial para cualquier editor de texto de todos modos. Por lo tanto, esta es la única forma de hacerlo:

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

Solo para que ustedes crean que este código Emacs Lisp es una forma correcta de hacerlo, les proporcionaré la fuente que usé para producirlo. Por defecto, la capacidad de escribir texto con la página de códigos ASCII de 8 bits actual se implementa en la cmds.cunidad de traducción del código fuente de 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 puede ver, el código Emacs Lisp anterior es la réplica exacta de este código C, excepto por una línea adicional:

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

¡Considérelo una advertencia, pero es importante tener esta línea ! De lo contrario, solo 7 bits de la página de códigos ASCII actual estarían disponibles (independientemente del hecho de que hayamos inicializado todos los 8 bits).

Alexander Shukaev
fuente
3
Esto parece excesivamente complejo. ¿Por qué no copiar los self-insert-commandenlaces del mapa de teclas global actual? (setq my-global-map (make-keymap)) (substitute-key-definition 'self-insert-command 'self-insert-command my-global-map global-map)
Gilles 'SO- deja de ser malvado'
1
@Gilles, no veo lo que encuentras complejo en 3 bucles, pero siéntete libre de seguir tu camino si ya lo has probado. Además, esta publicación es más de un valor educativo, por lo que las personas que eliminan de global-mapinmediato saben qué problema van a enfrentar y cuál es la receta para resolverlo. Probablemente aprenderán algo nuevo sobre ASCII en general y / o cómo se implementa en Emacs en particular.
Alexander Shukaev el