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?

象 嘉 道
quelle
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)
Stefan
quelle
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)
Drew
quelle
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)))))
Gilles 'SO - hör auf böse zu sein'
quelle