Angenommen, ich habe einen magical-mode
Hauptmodus mit dem Namen heruntergeladen und er hat eine eigene magische Tastaturbelegung mit dem Namen magical-mode-map
. Dieser Modus bietet auch einen Hook, magical-mode-hook
der jedes Mal ausgeführt magical-mode
wird, wenn er zum Hauptmodus eines Puffers wird. Jetzt möchte ich meine Init-Datei so ändern, dass einige benutzerdefinierte Tastenkombinationen hinzugefügt werden, die in diesem Modus verwendet werden.
Es scheint (mindestens) zwei Möglichkeiten zu geben, benutzerdefinierte Tastaturbelegungen für einzurichten magical-mode
. Das, was ich am häufigsten sehe, ist folgendes:
(defun my-magical-keys ()
(local-set-key (kbd "C-i") 'previous-line)
(local-set-key (kbd "C-k") 'next-line)
(local-set-key (kbd "C-j") 'backward-char)
(local-set-key (kbd "C-l") 'forward-char))
(add-hook 'magical-mode-hook 'my-magical-keys)
Es ist aber auch möglich, dies so zu tun:
(define-key magical-mode-map (kbd "C-i") 'previous-line)
(define-key magical-mode-map (kbd "C-k") 'next-line)
(define-key magical-mode-map (kbd "C-j") 'backward-char)
(define-key magical-mode-map (kbd "C-l") 'forward-char)
Die zweite Methode scheint mir tatsächlich sauberer zu sein. Gibt es irgendwelche Vorteile, wenn man es auf die eine oder andere Weise macht?
quelle
C-n
und GutenC-p
. Das Beispiel ist nur Dummy-Code. Ich wollte einige sehr einfache Beispielmodi und Beispielbindungen entwickeln, damit die Bindungen selbst nicht vom eigentlichen Zweck der Frage ablenken.Antworten:
Der zweite Ansatz ist vorzuziehen, da hierdurch die Tastenbelegung des Modus nur einmal geändert wird.
Wenn Sie den Hook des Modus verwenden, wird dieser jedes Mal aufgerufen, wenn dieser Modus in einem Puffer aktiviert wird. Wenn Sie dies erneut tun, hat dies in der Regel keine Auswirkungen, da die Tasten nur wieder an das gebunden sind, woran sie bereits gebunden sind. Keymaps im Hauptmodus sind für den Hauptmodus "lokal", nicht für die einzelnen Puffer, die diesen Modus verwenden. Wenn Sie also eine Bindung in einem dieser Puffer mit ändern
local-set-key
, wirkt sich dies auf alle Puffer mit demselben Hauptmodus aus.local-set-key
ist in erster Linie dazu gedacht, als Befehl verwendet zu werden. Wenn Sie festgestellt haben, dass Sie einige Änderungen dauerhaft vornehmen möchten, verwenden Siedefine-key
die Modus-Keymap als erstes Argument.Wenn Sie die Keymap mit einem Hook immer und immer wieder ändern, kann dies zu Konflikten mit der beabsichtigten Verwendung von führen
local-set-key
. Angenommen, Sie haben verwendet,M-x local-set-key RET C-i fancy-previous-line RET
weil Sie diese Variante von ausprobieren möchtenprevious-line
. Wenn Sie jetzt einen neuen Puffer öffnen, der denselben Hauptmodus verwendet, wird der Hook erneut ausgeführt und überschreibt Ihre temporäre Bindung in allen Puffern , die diesen Hauptmodus verwenden, einschließlich des Puffers, in dem Sie zuvor gearbeitet habenlocal-set-key
.quelle
(eval-after-load 'magical '(progn (define-key magical-mode-map ...) ...))
.Verwenden
(define-key my-magical-mode-map …)
ist der normale Weg.Wenn Sie einen Haken und verwenden
local-set-key
, werden die Schlüssel jedes Mal hinzugefügt, wenn Sie in einem Puffer den My Magical-Modus aufrufen. Das ist seltsam, weil eslocal-set-key
alle Puffer betrifft, die sich im selben Modus befinden (im Allgemeinen alle Puffer, die dieselbe Tastaturbelegung verwenden). Wenn Sie Änderungen an der Keymap vorgenommen haben, werden diese bei jedem Wechsel in den Modus "My Magical" in einem Puffer überschrieben.Die zweite Methode kann auch verwirrend sein, wenn Sie die Tastaturbelegung an verschiedenen Stellen anpassen. Die Hooks werden in umgekehrter Reihenfolge ausgeführt als die Reihenfolge, in der sie hinzugefügt wurden. Bis zur ersten Ausführung sehen Sie keine Spur Ihrer Anpassungen.
quelle
Sie fragen anscheinend nicht nach der Definition einer Tastaturbelegung im Hauptmodus, sondern nach dem Benutzercode , um ein paar Tastaturbelegungen in einer vorhandenen Tastaturbelegung im Hauptmodus hinzuzufügen oder zu ändern . Sie sagen "Brauch", was dies nahelegt, aber wir könnten es genauso gut klarstellen.
Um sicher zu sein, was Sie sagen, dass Sie am häufigsten dafür sehen, wird im Allgemeinen nicht verwendet, um eine Tastaturbelegung im Hauptmodus zu definieren . Dies ist beispielsweise nicht das, was Sie im Emacs-Quellcode finden. Und es ist nicht das, was im Elisp-Handbuch (Knoten
Major Mode Conventions
) empfohlen wird .Ich wollte das nur aus dem Weg räumen, um es anderen klar zu machen: Im Allgemeinen möchten Sie den Modus-Hook nicht zum Definieren der Hauptmodus-Map verwenden.
Zu Ihrer Frage zu Benutzerschlüsselanpassungen -
In jedem Fall ist es nicht so,
local-set-key
dass Sie in einem Modus Hook verwenden sollten. Verwenden Sie einfachdefine-key
die Tastaturbelegung für den Hauptmodus, genau wie im ersten Beispiel. @tarsius hat dies bereits gut erklärt.Abgesehen davon lautet die Antwort: Es ist im Allgemeinen unerheblich , ob Sie die Schlüssel (
define-key
mit der Modusübersicht) ein für alle Mal binden oder Sie verwenden den Haken, um sie bei jedem Wechsel in den Modus zu binden.Es kann jedoch einen Unterschied machen, ob sich Bindungen in der Karte ändern, indem Sie beispielsweise einen anderen Code laden, der sie ändert. In diesem Fall wird durch das Setzen von Bindungen auf den Hauptmodus-Hook sichergestellt, dass die Bindungen hergestellt werden, wenn der Modus aufgerufen wird. Das heißt, es stellt sicher, dass sie erstellt werden, aber es stellt nicht sicher, dass sie anschließend durch nichts anderes geändert werden (z. B. eine andere Funktion am selben Hook, die anschließend aufgerufen wird). Denken Sie daran, dass Sie nur wenig Kontrolle darüber haben, was wann ausgeführt wird - es sei denn, Sie sind sich sicher, dass nur Ihr eigener Code damit in Konflikt gerät.
Das ist der einzige Unterschied in der Wirkung, den ich mir vorstellen kann. Sie müssen entscheiden, wann Sie diesen Unterschied für einen Vorteil des einen oder anderen Ansatzes halten. FWIW, wenn ich meinen eigenen Code betrachte, glaube ich nicht, dass ich jemals Schlüssel an einen Mode-Hook gebunden habe.
quelle
Ihre Benennung ist wenig verwirrend (ich denke, Sie sollten
my
in Ihrem zweiten Teil der Frage entfernen ).Angenommen, es
my-magical-keys
handelt sich um eine Benutzeranpassungsfunktionmagical-mode
, sehe ich einen offensichtlichen Vorteil. Es ist leicht, (durchremove-hook
) Haken in einem Rutsch zu entfernen .Der zweite Vorteil ist, wofür Funktionen gedacht sind. Ich meine, sie sind wiederverwendbar. Sie können sie in andere Modi einbinden.
Bearbeiten:
Wie @tarsius betont hat, wird das ursprüngliche Verhalten durch Entfernen des Hooks nicht wiederhergestellt, und es ist möglicherweise besser, die Funktion in einen Nebenmodus zu ändern.
quelle
my-magical-mode
. Wenn die Verwendung desmy-
Präfixes jedoch verwirrend ist, kann ich die Frage auf jeden Fall bearbeiten.my-
wird für Benutzerfunktionen hinzugefügt.my-
damit niemand den Eindruck hat, dass ich gefragt habe, wie ein realer Modus namens konfiguriert werden sollmagical-mode
(falls vorhanden).