Wie kann man ALLE globalen Tastenkombinationen wirklich lösen?


8

Ich habe es gerade versucht

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

Aber die Ausgabe C-hbzeigt immer noch jede Menge Mist, besonders im Abschnitt " Globale Bindungen ":

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

und es werden noch so viele kommen.

Ich würde diese gerne komplett loswerden. Wie kann ich das möglicherweise in einem einfachen Funktionsaufruf tun? Ich möchte, dass die Lösung ein vollständiges Auslöschen ist und nicht eine Schleife, auf die alle diese Karten eingestellt sind nil. Vielen Dank im Voraus.

HINWEIS: Bitte keine Lehrantworten oder Spam-Kommentare wie "Diese Schlüssel sind für die Produktivität unerlässlich, tun Sie das nicht!" . Ich habe hier eine stark angepasste Emulationsebene für die modale Textbearbeitung, daher benötige ich diese Standardbindungen überhaupt nicht.


Ich bin neugierig. Was ist daran falsch, evil-modedass Sie Ihre eigene modale Bearbeitungsebene schreiben müssen?
Tu Do

@ Tu Do ist es evil-mode, aber einige seiner Funktionen der obersten Ebene: Operatoren, Textobjekte und einige Befehle wurden irgendwie neu geschrieben oder erweitert. Die Standardbindungen wurden von Anfang an vollständig gelöscht und über die Tastatur neu angeordnet. Dies hat jedoch nichts mit der Frage zu tun.
Alexander Shukaev

Ich habe nur um Neugier gebeten. Aber danke.
Tu Do

Sie sollten wahrscheinlich eine nicht spärliche Keymap verwenden, die mit erstellt wurde make-keymap.
Tarsius

Antworten:


16

Entnommen aus dem Emacs Lisp-Handbuch (siehe Steuern aktiver Karten ):

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

Um das Handbuch zu zitieren: "Es ist sehr ungewöhnlich, die globale Keymap zu ändern." Sicherheitshinweis: Stellen Sie sicher, dass Sie Puffer speichern und Emacs anschließend mit einer anderen Keymap sauber beenden können. Andernfalls müssen Sie sie ohne gespeicherte Änderungen beenden.


Du bist der Mann!
Alexander Shukaev

6

Obwohl die folgenden Informationen keine direkte Antwort auf die Frage sind (da sie bereits von @wasamasa beantwortet wurden), glaube ich immer noch, dass sie eine wesentliche Ergänzung der Antwort sind. Der Punkt ist, dass nach der Ausgabe

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

man löscht tatsächlich den Abschnitt Globale Bindungen vollständig aus und kann folglich nicht einmal mehr Text eingeben! In den allermeisten Fällen möchte man natürlich die Fähigkeit zur Eingabe von Text wiederherstellen, da dies für jeden Texteditor ohnehin unerlässlich ist. Hier ist der eine Weg, dies zu tun:

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

Nur damit ihr glaubt, dass dieser Emacs Lisp-Code ein korrekter Weg ist, werde ich die Quelle bereitstellen, aus der ich ihn erstellt habe. Standardmäßig ist die Möglichkeit zum Eingeben von Text mit der aktuellen 8-Bit-ASCII-Codepage in der cmds.cÜbersetzungseinheit des Emacs C-Quellcodes implementiert :

  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");

Wie Sie sehen können, ist der Emacs Lisp-Code oben die genaue Replikation dieses C-Codes, mit Ausnahme einer zusätzlichen Zeile:

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

Betrachten Sie es als eine Einschränkung, aber diese Linie ist wichtig zu haben! Andernfalls wären nur 7 Bit der aktuellen ASCII-Codepage verfügbar (unabhängig davon, dass wir alle 8 Bit initialisiert haben).


3
Dies scheint übermäßig komplex. Warum kopieren Sie nicht die self-insert-commandBindungen von der aktuellen globalen Keymap? (setq my-global-map (make-keymap)) (substitute-key-definition 'self-insert-command 'self-insert-command my-global-map global-map)
Gilles 'SO - hör auf böse zu sein'

1
@ Gilles, ich sehe nicht, was Sie in 3 Schleifen komplex finden, aber Sie können Ihren Weg gehen, wenn Sie es bereits getestet haben. Außerdem ist dieser Beitrag eher ein pädagogischer Wert, sodass Leute, die ihn auslöschen, global-mapsofort wissen, mit welchem ​​Problem sie konfrontiert werden und welches Rezept es zu lösen gilt. Sie werden wahrscheinlich etwas Neues über ASCII im Allgemeinen und / oder dessen Implementierung in Emacs im Besonderen erfahren.
Alexander Shukaev
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.