2 Stimmen

Definieren Sie den Schlüssel im Präfix-Schlüsselverzeichnis für einen bestimmten Modus

Ich habe alle meine Tastenzuordnungen in einem separaten Mindermodus - erstens, um sicherzustellen, dass Tastenzuordnungen, die ich für obligatorisch halte, nicht von einem Hauptmodus überschrieben werden; und zweitens, um sie alle in einem Befehl deaktivieren zu können, falls ich es brauche.

Bis jetzt habe ich Präfixtasten wie folgt erweitert:

(define-key my-minor-mode-map (kbd "M-g f") 'my-goto-file-func)

Aber dann habe ich festgestellt, dass es so etwas wie einen Präfixtastenabstand gibt, und für die Taste M-g ist es goto-map. Also würde ich lieber diesen Tastenabstand erweitern anstatt den Präfixtasten fest zu kodieren, damit es so wäre:

(define-key goto-map (kbd "f") 'my-goto-file-func)

Aber in diesem Fall hat mein Mindermodus nichts damit zu tun, also verliere ich alle Vorteile seiner Verwendung.

Ein Weg wäre zu bestimmen, welche Taste an diesen bestimmten Präfixtastenabstand gebunden ist und dann diese Taste in den Zuordnungen zu verwenden. Aber das hat einen Nachteil - der Präfixtastenabstand würde für meinen Mindermodus nicht neu zugeordnet, wenn ich ihn nach dem Laden meines Mindermodus neu zuordne.

Gibt es also bessere Möglichkeiten, das zu tun?

3voto

olaf b Punkte 606

Die Art und Weise, wie du Schlüssel erweiterst, ist völlig in Ordnung, da sie die Komplexität minimal hält. Es ist also durchaus möglich, einen Schlüsselzuordnungsplan in deinem Minor-Modus zu ändern, aber nicht unbedingt besser.

Um einen modifizierten Schlüsselzuordnungsplan in deinem Minor-Modus zu verwenden, ohne den Originalplan zu überschreiben, setze einfach das Original als dein parent, z.B.

(defvar my-goto-map
  (let ((map (make-sparse-keymap)))
    (set-keymap-parent map goto-map)
    map))

Dann kannst du eine modifizierte Version in deinem Minor-Modus verwenden:

(define-key my-goto-map "f" 'find-file)
(define-key my-mode-map (kbd "M-g") my-goto-map)

Aber der originale goto-map ist immer noch aktiv, und Änderungen daran werden sich in deinem my-goto-map widerspiegeln:

(define-key goto-map "i" 'info)

Siehe "Vererbung und Schlüsselzuordnungspläne" im Elisp-Handbuch.

0voto

MnZrK Punkte 1232

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:

  1. Variable, die eine Liste enthält, deren erstes Element das Symbol 'keymap ist (und so werden Keymaps in der Regel in Emacs verwendet)
  2. 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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X