Beachten Sie, dass die Antwort von olab b völlig in Ordnung ist und ich werde seine Antwort akzeptieren und selbst verwenden, aber es gibt ein Problem damit:
Das ursprüngliche goto-map
bleibt unverändert. Stellen Sie sich eine hypothetische Situation vor, in der eine Bibliothek einen Befehl bereitstellt, der auf irgend eine Weise goto-map
verwendet - zum Beispiel, um eine schicke Benutzeroberfläche für Befehle darin anzubieten oder sich daran in seinem eigenen Tastaturbelegungen zu binden - das ist etwas, was helm
machen könnte, wenn sie verrückt genug wären. Da alle meine Tasten zum my-goto-map
gehen würden, würden sie sich nicht in diesen Erweiterungen widerspiegeln.
Hier ist also eine seltsame Lösung für ein erfundenes Problem, einfach nur zum Spaß:
Zunächst ist zu beachten, dass ein Tastenbelegungs in Elisp eine von zwei Dingen sein kann:
- Variable, die eine Liste enthält, deren erstes Element das Symbol
'keymap
ist (und so werden Keymaps in der Regel in Emacs verwendet)
- Symbol, dessen Funktionszelle auf die Tastenbelegungsvariable gesetzt ist (und ich habe noch nie gesehen, dass das jemand so verwendet hat)
Zuerst definieren wir also eine Variable für unseren Keymap:
(defvar my-goto-map (make-sparse-keymap))
Dann schreiben wir seinen Wert auch in die Funktionszelle:
(fset 'my-goto-map my-goto-map)
Beachten Sie, dass wir nicht goto-map
ersetzen können, da alles, was bereits damit gebunden war, die Ersetzung nicht einfangen würde. Und das Manipulieren von Tastenbindungen einzeln macht keinen Spaß. Also hier ist ein richtiger Einfügevorgang:
(setcdr goto-map (cons (make-composed-keymap 'my-goto-map (cons (car goto-map) (cdr goto-map))) nil))
(Natürlich könnten wir einfach my-goto-map
an goto-map
anhängen, aber in diesem Fall wäre die Beziehung zwischen my-goto-map
und dem originalen goto-map
"benachbart" und nicht "Eltern-Kind"; und "benachbart" erlaubt keine Entfernung von Tastenbelegungen)
Beachten Sie, dass goto-map
jetzt vom Symbol my-goto-map
abhängt, sodass wir mit diesem Symbol alles tun können, ohne unseren Keymap zu verlieren. So können wir alle benutzerdefinierten Tastenbelegungen einfach deaktivieren:
(fset 'my-goto-map nil)
Und die Variablenzelle von my-goto-map
bleibt unberührt, sodass wir Tastenbelegungen einfach wiederherstellen können:
(fset 'my-goto-map my-goto-map)
Der Hauptnachteil liegt darin, dass Emacs keine "pufferlokale Funktionen" erlaubt, nur "pufferlokale Variablen". Und hier brauchen wir eine lokale Funktion :( Also können wir die Aktivierung des Präfix-Map nicht einfach im Hook des Minor-Modus machen - denn diese Änderung würde sich global auswirken.
Aber zumindest würden automatisch alle Originalpräfixtasten für diesen Keymap (was nur M-g
ist, wenn ich mich richtig erinnere) alle benutzerdefinierten Tastenbelegungen verwenden, sodass es nicht nötig ist, M-g
als Präfixtaste im my-goto-map
hartcodiert zu haben.