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-mode
Befehle während der Bearbeitung leicht verfügbar wärenorg-mode
. - Ich besuche häufig einen IRC-Raum mit Markdown-Unterstützung, daher wäre es auch schön, wenn
markdown-mode
Keybinds hinzugefügt würdenerc-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-mode
Schlüssel überschreiben . Was ich möchte, ist:
Wenn ein Schlüssel in latex-mode-map
AND definiert ist, in dem er nicht definiert
org-mode-map
ist, verwenden Sie die latex-mode-map
Bindung .
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.
quelle
make-composed-keymap
.Antworten:
Dies stellte sich als einfacher als erwartet heraus. Wie in den Kommentaren hier und zur Frage vorgeschlagen:
Dadurch wird eine Keymap erstellt, die eine Kopie von ist,
erc-mode-map
aber auch von dieser erbtmarkdown-mode-map
. Allemarkdown
Schlüssel werden also immer dann beschattet, wenn sie miterc
Schlü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.
quelle
define-key
des Rückgabewerts vonmake-composed-keymap
unerwartete Nebenwirkungen auf die ursprünglichen Keymaps haben kann, und ich vermute, dass dies auch für diese manuelleappended
Zuordnung gilt. Wenn Sie verwenden möchten,define-key
ist es am sichersten, eine neue Keymap zu erstellen, deren übergeordnete Keymap eine zusammengesetzte Keymap ist.(define-key erc-mode-map "\C-c\C-s" nil)
, wird der entsprechendemarkdown-mode
wird Schlüssel noch zur Verfügung steht , auch in erc Puffern.make-composed-keymap
Dokumentation heißt es: "Eine Nullbindung in MAPS überschreibt jede entsprechende Bindung in PARENT, überschreibt jedoch nicht die entsprechenden Bindungen in anderen Keymaps von MAPS." Wiemarkdown-mode-map
in Ihrem Beispiel PARENT, würde ich erwarten, dass diesenil
Bindung die Markdown-Bindung hemmt?(make-composed-keymap (list erc-mode-map markdown-mode-map))
dies den von Ihnen beschriebenen Effekt haben würde.cl-copy-list
wird nicht wirklich tun, was Sie wollen. Wenn Sie die Keymap kopieren möchten, sollten Sie verwendet habencopy-keymap
.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:Dies liegt daran, dass
define-key
manchmal die als erstes Argument übergebenen Karten geändert werden könnenmake-composed-keymap
, nicht jedoch die als zweites übergebenen. Ich denke, Sie solltenM-x report-emacs-bug
und fordern, dass Siemake-composed-keymap
eine Liste von Keymaps als zweites Argument akzeptieren , damit Sie es einfach tun könnenquelle