Warum macht dieser Code nicht alle Tastenkombinationen in einer Keymap ungültig?

7

Kurz gesagt, es gibt eine kleine Bibliothek, die ich mag, aber ich mag keine der Standard-Tastenkombinationen. ZB ist es ein globaler Nebenmodus und bindet eine Funktion an C-c C-s, aber diese Schatten org-schedulein meinen Organisations- und Organisationsagenda-Puffern.

Ich möchte die kleine Bibliothek behalten, aber alle Bindungen in der Keymap der kleinen Bibliothek entfernen.

In einem frühen Versuch, dies zu tun, habe ich Folgendes versucht (nachdem ich bestätigt hatte, dass little-library-mode-mapdort die Bindungen leben):

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

Der Code "ist erfolgreich" ( C-h v little-library-mode-map RETzeigt, dass es gerade erst ist (keymap)), aber alle kleinen Bibliotheksschlüsselbindungen "funktionieren" C-c C-simmer noch (funktioniert immer noch die kleine Bibliotheksfunktion, einschließlich in den Puffern "org" und "org-Agenda").

Ich habe einen anderen Weg gefunden, um mein Problem zu lösen, bin aber sehr gespannt, warum dieser Ansatz fehlschlägt. Emacs 'Tastenkombinationen erscheinen mir immer noch wie schwarze Magie.

lila_Pfeile
quelle
Sie müssen die Datenstruktur, die der Nebenmodus verwendet, destruktiv ändern, z (setcdr little-library-mode-map nil).
Wasamasa

Antworten:

3

In dieser Geschichte gibt es drei wichtige Dinge:

  • die Nebenmodus-Keymap
  • seinen Namen
  • die spärliche Keymap, die Sie erstellen

Grundsätzlich haben Sie den Namen anstelle des Originals auf die spärliche Keymap gesetzt, aber es ist zu spät: Im Nebenmodus wird das Original verwendet.

Junger Frosch
quelle
Ah, verstanden. Wenn Sie es so ausdrücken, macht es vollkommen Sinn. Wissen Sie, wie Emacs / der Moll-Modus die ursprüngliche Keymap findet? In welcher Datenstruktur sieht es aus?
lila_Pfeile
3
@purple_arrows Die ursprüngliche Keymap befindet sich in minor-mode-map-alist.
Npostavs
2

Irgendwann beim Aktivieren little-library-modeder in der Variablen gespeicherten Keymap wird Folgendes little-library-mode-maphinzugefügt minor-mode-map-alist:

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

Emacs verwendet diese Liste, um Bindungen im Nebenmodus zu suchen. Wenn Sie die Variable anschließend little-library-mode-mapan einen neuen Wert binden, hat dies keine Auswirkung auf die Keymap- minor-mode-map-alistPunkte, auf die verwiesen wird . Wie im Kommentar von @wasamasa erwähnt, besteht eine Möglichkeit, alle Bindungen in dieser Keymap zu entfernen, darin, die Keymap direkt zu mutieren:

 (setcdr little-library-mode-map nil)

Eine andere Möglichkeit besteht darin, die Keymap vor dem Laden der Bibliothek zurückzusetzen:

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

Wenn sich der Moll-Modus gut verhält, wird dadurch auch vermieden, dass seine Bindungen instanziiert werden.

Clemera
quelle