Verwenden Sie zwei Hauptmodus-Maps im selben Puffer


11

Ich bin auf einige Situationen gestoßen, in denen es sehr praktisch wäre, wenn die Keymap eines Hauptmodus als Fallback-Keymap für einen anderen Hauptmodus fungieren müsste. Zum Beispiel:

  • Ich schreibe viel LaTeX in einige meiner Organisationsdokumente, daher wäre es großartig, wenn latex-modeBefehle während der Bearbeitung leicht verfügbar wären org-mode.
  • Ich besuche häufig einen IRC-Raum mit Markdown-Unterstützung, daher wäre es auch schön, wenn markdown-modeKeybinds hinzugefügt würden erc-mode.

In beiden Fällen sollte diese zusätzliche Tastaturbelegung als Fallback dienen (daher kann ich hierfür nicht einfach einen Nebenmodus verwenden ). Ich möchte nicht, dass Latexbefehle org-modeSchlüssel überschreiben . Was ich möchte, ist:
Wenn ein Schlüssel in latex-mode-mapAND definiert ist, in dem er nicht definiert org-mode-mapist, verwenden Sie die latex-mode-mapBindung .

F: Wie kann ich eine Keymap als Fallback-Keymap für einen Major-Modus festlegen?
ODER
F: Wie können Schlüssel von einer Hauptmoduszuordnung in eine andere kopiert werden, ohne dass etwas überschrieben wird?


Nur um das klar zu stellen. Ich weiß, dass ich diese Schlüssel einzeln definieren könnte, aber es wäre unendlich bequemer, eine automatisierte Lösung zu haben.


6
Verwenden Sie eine Keymap-Zusammenführung. Siehe make-composed-keymap.
Drew

Antworten:


12

Dies stellte sich als einfacher als erwartet heraus. Wie in den Kommentaren hier und zur Frage vorgeschlagen:

(with-eval-after-load 'erc
  (require 'markdown-mode)
  (require 'cl-lib)
  (setq erc-mode-map
        (make-composed-keymap (cl-copy-list erc-mode-map)
                              markdown-mode-map)))

Dadurch wird eine Keymap erstellt, die eine Kopie von ist, erc-mode-mapaber auch von dieser erbt markdown-mode-map. Alle markdownSchlüssel werden also immer dann beschattet, wenn sie mit ercSchlüsseln kollidieren .

Wenn Sie noch einige Schlüssel des Notfall keymap wollen die Haupt kemap in den Schatten stellen, nur deaktivieren sie in Haupt ein.

(define-key erc-mode-map "\C-c\C-a" nil)

2
Ich habe festgestellt, dass die Verwendung define-keydes Rückgabewerts von make-composed-keymapunerwartete Nebenwirkungen auf die ursprünglichen Keymaps haben kann, und ich vermute, dass dies auch für diese manuelle appendedZuordnung gilt. Wenn Sie verwenden möchten, define-keyist es am sichersten, eine neue Keymap zu erstellen, deren übergeordnete Keymap eine zusammengesetzte Keymap ist.
Jon O.

@ JonO. Eigentlich war ich sehr überrascht, dass dies hier nicht passiert. Wenn ich das tut (define-key erc-mode-map "\C-c\C-s" nil), wird der entsprechende markdown-modewird Schlüssel noch zur Verfügung steht , auch in erc Puffern.
Malabarba

Malabarba: Ich glaube, Ihr letzter Kommentar gilt nach dieser Codeänderung nicht mehr. In der make-composed-keymapDokumentation heißt es: "Eine Nullbindung in MAPS überschreibt jede entsprechende Bindung in PARENT, überschreibt jedoch nicht die entsprechenden Bindungen in anderen Keymaps von MAPS." Wie markdown-mode-mapin Ihrem Beispiel PARENT, würde ich erwarten, dass diese nilBindung die Markdown-Bindung hemmt?
Phils

2
Meine Interpretation ist, dass (make-composed-keymap (list erc-mode-map markdown-mode-map)) dies den von Ihnen beschriebenen Effekt haben würde.
Phils

1
cl-copy-listwird nicht wirklich tun, was Sie wollen. Wenn Sie die Keymap kopieren möchten, sollten Sie verwendet haben copy-keymap.
Stefan

3

Wie von @Malabarba erwähnt, können Sie dafür verwenden make-composed-keymap. Wenn Sie jedoch wirklich möchten, dass die neue Keymap von beiden Keymaps erbt, wirkt sich das Ändern der neuen Keymap auf keine der beiden anderen Keymaps aus. Sie müssen dies in zwei Schritten tun:

(make-composed-keymap
 nil (make-composed-keymap (list erc-mode-map markdown-mode-map)))

Dies liegt daran, dass define-keymanchmal die als erstes Argument übergebenen Karten geändert werden können make-composed-keymap, nicht jedoch die als zweites übergebenen. Ich denke, Sie sollten M-x report-emacs-bugund fordern, dass Sie make-composed-keymapeine Liste von Keymaps als zweites Argument akzeptieren , damit Sie es einfach tun können

(make-composed-keymap nil (list erc-mode-map markdown-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.