Manchmal werden meine globalen Tastenkombinationen von einem Hauptmodus überschrieben. Ein einfaches Beispiel ist die folgende Einstellung in meiner Init-Datei
(global-set-key (kbd "C-j") 'newline-and-indent)
Ärgerlicherweise wird diese Tastenkombination durch den Hauptmodus "Lisp Interaction" (Lisp-Interaktion) ausgeblendet, der der Standardmodus des Arbeitspuffers ist.
Wenn ich mich in einer Situation befinde, in der ein Hauptmodus (oder ein Nebenmodus) meine globale Tastenkombination verbirgt, wie kann ich sie wieder herstellen?
Hinweis: Meine Frage ist nicht : „Wie kann ich binden C-j
an newline-and-indent
‚? Mode‘in“ Lisp - Interaktion Ich interessiere mich für eine viel allgemeinere Antwort zum Umgang mit zusammenstoßenden Tastenkombinationen oder Benutzertastenkombinationen, die durch einen Dur / Moll-Modus ausgeblendet werden.
quelle
Antworten:
Es gibt auch einen "Shortcut" -Ansatz für dieselbe Lösung, wenn Sie nicht Ihren eigenen Nebenmodus definieren möchten (über den ich in meiner ersten Antwort spreche).
Sie können das
use-package
Installationspaket zur Verfügung von Melpa und nutztbind-key*
oderbind-keys*
Makro , das Teil des istbind-key
Pakets , dass Schiffe mituse-package
.Aus der Dokumentation von
bind-key.el
:quelle
emulation-mode-map-alists
Vorrang erzwungen wird.(bind-key* "C-M-&" 'override-global-mode)
, um Ihre init, und Sie können in der Regel die Bindungen aus dem Weg schnell bekommen , wenn Sie benötigen. Daoverride-global-mode
es sich nicht um einen "globalen" Nebenmodus handelt, müssen Sie ihn dennoch pufferweise deaktivieren. Wenn Sie also häufig feststellen, dass Sie die globalen Überschreibungsschlüssel deaktivieren, ist diese Lösung nicht praktisch.Sie können Ihren eigenen Nebenmodus und seine Tastenbelegung definieren und alle anderen Modi (Moll + Dur) überschreiben. Genau deshalb habe ich mich entschieden, meinen eigenen Nebenmodus zu schreiben.
Mit den folgenden Schritten können Sie festlegen, dass Ihre Tastenkombinationen alle Verknüpfungen überschreiben:
(define-key my-mode-map (kbd "C-j") #'newline-and-indent)
In ähnlicher Weise überschreiben Ihre anderen in Ihrem Nebenmodus festgelegten Tastenbelegungen die in anderen Modi.
Ich empfehle dringend, den Blog-Beitrag von Christopher Wellons zu lesen, in dem erklärt wird, wie man einen Nebenmodus schreibt. Dieser Blog und das Ärgernis, mehrere Tastenkombinationen
nil
in mehreren Haupt- und Nebenmodi festlegen zu müssen, haben mich dazu inspiriert, meinen eigenen Nebenmodus zu schreiben.Der beste Teil dieser Vorgehensweise ist, dass Sie, wenn Sie überprüfen möchten, wie die Tastenkombinationen in der Standardkonfiguration von emacs funktionieren, einfach den Nebenmodus deaktivieren. Sie schalten es dann wieder ein und Sie erhalten Ihre benutzerdefinierten Tastenkombinationen zurück.
quelle
Wenn eine globale Bindung eine Hauptmodusbindung überschreiben soll, legen Sie die Bindung einfach
nil
im Hauptmodus fest:Es ist nicht möglich, dass die globale Bindung im Allgemeinen Vorrang vor allen Modi hat (andernfalls macht es keinen Sinn, über Hauptmodi zu verfügen), aber Sie könnten sie umgehen, indem Sie Ihren eigenen Nebenmodus mit den wichtigsten Bindungen erstellen. Dann hätten Sie zumindest Vorrang vor den meisten (wenn auch nicht unbedingt allen) Modi.
quelle
(define-key foo-mode (kbd "C-j") nil)
Hauptmodus namens "foo-mode" installiere, kann ich meine .emacs-Datei einfügen und damit rechnen, dass dies funktioniert?foo-mode-map
(mein Beispiel in der Antwort war schlecht), aber ja, dadurch wird die Tastaturbindung im Hauptmodus deaktiviert, sodass stattdessen die globale Tastaturbindung verwendet wird (es sei denn, es gibt einen anderen Nebenmodus, der sie verwendet).foo-mode
aufgerufen wirdfoo-mode-map
?Sie können diese Makros verwenden:
EDIT :
Überprüfen Sie das Beispiel unten:
Wenn die Keymap X Ihre globale Bindung Y überschreibt, schreiben Sie:
(expose-bindings X '("Y"))
Und dann wird die Außerkraftsetzung rückgängig gemacht.
quelle
other map
, wodurch die globale Kartenbindung durch den offen gelegt wirdother map
. Mit der zweiten können Sie nur die erste für eine Liste von Bindungen anwenden.expose-bindings
zuerst aus und binde diese Schlüssel dann global an die gewünschten Befehle? Vielleicht könnten Sie ein Beispiel dafür zeigen, was ich in meine Init-Datei einfügen könnte, damit dies funktioniert.