Wie füge ich allen Tastenkombinationen eines bestimmten Modus einen Präfixschlüssel hinzu?


7

Ich benutze einen Modus, bin aber nicht an seine Tastenkombinationen gewöhnt: Einige von ihnen stehen in Konflikt mit den globalen Emacs. Daher möchte ich allen vorhandenen Tastenkombinationen eine Präfix-Schlüsselbindung hinzufügen.

Wenn beispielsweise my-mode die Schlüsselbindung M-]für my-mode-shot definiert , suche ich nach folgenden Möglichkeiten:

(define-prefix-for-mode 'my-mode (kbd "C-c m"))

dann ist die schlüsselbindung für my-mode-shot jetzt C-c m M-].

Wie sollte man allen verfügbaren Schlüsselbindungen eines bestimmten Modus eine Präfix-Schlüsselbindung hinzufügen?


1
Dies kann von der Art des Modus abhängen. Können Sie Details angeben?
— Stefan

@Stefan Ich suche eine allgemeine Lösung, keine modusspezifische.
— 嘉 道

Eine Lösung, die für alle Modi zuverlässig funktioniert, ist wahrscheinlich unmöglich. Sie können wahrscheinlich eine Lösung mit dem von mir bereitgestellten Code erstellen, der für die meisten Hauptmodi funktioniert.
— Stefan

Antworten:


4

Eine Möglichkeit, die Tastenkombinationen von -mode zu verschieben, könnte so etwas sein

(let ((origmap <foo>-mode-map)
      (newmap (make-sparse-keymap)))
  (define-key newmap <prefix> origmap)
  (setq <foo>-mode-map newmap))  

Dieser Code schlägt jedoch fehl, wenn er ausgeführt wird, bevor der foo-Modus ausgeführt wird. Und es hat keine Auswirkung, wenn es ausgeführt wird, nachdem der Modus aufgerufen wurde. Also müssen Sie es wahrscheinlich im `(with-eval-after-load'-Modus ...) tun.

Wenn es sich um einen Nebenmodus handelt, hat der obige Code auch keine Auswirkung, da Sie zusätzlich Folgendes tun müssen (innerhalb des oben genannten let):

(setcdr (assq '<foo>-mode minor-mode-map-alist) newmap)

2
  1. Definieren Sie einen Präfixschlüssel für die Keymap des Modus.
  2. Deaktivieren Sie die anderen Tasten, die Sie stören, aus dieser Keymap.

Angenommen, dieser Modus foo-modebindet den Schlüssel C-x oan foo-itund das gefällt Ihnen nicht.

(define-key foo-mode-map (kbd "C-x o") nil)

Angenommen, Sie möchten einen foo-mode-mapPräfixschlüssel verwenden <f9>:

(define-prefix-command 'foo-mode-map)
(define-key global-map (kbd "<f9>") 'foo-mode-map)

Dies führt auch dazu, dass foo-itdas nicht über verfügbar ist. Dies <f9> C-x okann sich selbst zunichte machen, wenn das Ziel darin besteht, die Tastenkombinationen aus dem Weg zu räumen und gleichzeitig über den Präfixschlüssel erreichbar zu bleiben.
— Nispio

1

Sie können die Keymap des Modus direkt ändern, um alle Bindungen unter dem von Ihnen gewählten Präfix zu verschieben:

(setcdr my-mode-map
  `(keymap (?\C-c keymap (?m keymap . ,(cdr my-mode-map)))))
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.