Unterschiede zwischen dem Setzen von Hauptmodustasten mit einem Haken und dem Hinzufügen dieser Tasten zur Modusübersicht

13

Angenommen, ich habe einen magical-modeHauptmodus 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-hookder jedes Mal ausgeführt magical-modewird, 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?

Nispio
quelle
Ich benutze die gleichen Tasten für die grundlegenden Bewegungsbefehle. Seien Sie gewarnt: Dies ist ein harter Kampf und Sie möchten vielleicht ein bisschen mehr über die Tastenbelegung lernen, bevor Sie damit beginnen.
Tarsius
@tarsius Eine harte Schlacht in der Tat. Ich bin diesen Weg schon einmal gegangen, aber jetzt bin ich wieder bei den Alten C-nund Guten C-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.
Nispio

Antworten:

15

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-keyist in erster Linie dazu gedacht, als Befehl verwendet zu werden. Wenn Sie festgestellt haben, dass Sie einige Änderungen dauerhaft vornehmen möchten, verwenden Sie define-keydie 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 RETweil Sie diese Variante von ausprobieren möchten previous-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 haben local-set-key.

Tarsius
quelle
Ich mag diese Antwort, aber was ist, wenn der Modus automatisch geladen wird?
10.
2
Sie können verzögern jeden Code , bis das Laden nach einiger Bibliothek geladen ist: (eval-after-load 'magical '(progn (define-key magical-mode-map ...) ...)).
Tarsius
4

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 es local-set-keyalle 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.

Gilles 'SO - hör auf böse zu sein'
quelle
2

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-keydass Sie in einem Modus Hook verwenden sollten. Verwenden Sie einfach define-keydie 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-keymit 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.

Drew
quelle
Vielen Dank. Ich habe die Frage geändert, um hoffentlich zu verdeutlichen, dass ich keinen Hauptmodus erstelle , indem ich einfach meine eigenen Tastenzuordnungen zu einem vorhandenen Hauptmodus hinzufüge .
Nispio
0

Ihre Benennung ist wenig verwirrend (ich denke, Sie sollten myin Ihrem zweiten Teil der Frage entfernen ).

Angenommen, es my-magical-keyshandelt sich um eine Benutzeranpassungsfunktion magical-mode, sehe ich einen offensichtlichen Vorteil. Es ist leicht, (durch remove-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.

kindahero
quelle
Ich passe einen hypothetischen Hauptmodus an, der genannt wird my-magical-mode. Wenn die Verwendung des my-Präfixes jedoch verwirrend ist, kann ich die Frage auf jeden Fall bearbeiten.
Nispio
Ja, das wäre besser, normalerweise (zumindest wie ich in freier Wildbahn sehe) my-wird für Benutzerfunktionen hinzugefügt.
Kindahero
1
Einverstanden. Ich habe das nur angewendet, my-damit niemand den Eindruck hat, dass ich gefragt habe, wie ein realer Modus namens konfiguriert werden soll magical-mode(falls vorhanden).
Nispio
1
Nein, durch Entfernen des Hakens werden die alten Bindungen nicht wiederhergestellt. Zumindest nicht, bis Emacs neu gestartet wird, und dann sehe ich es nicht als große Verbesserung an, dass ich nur eine Zeile anstelle von vier auskommentieren muss.
Tarsius
2
Als zweiten Vorteil erwähnen Sie: Hier wäre es vorzuziehen, einen Nebenmodus zu erstellen, der dann für verschiedene Hauptmodi und / oder nur einige der Puffer unter Verwendung eines bestimmten Hauptmodus aktiviert werden könnte.
Tarsius