Was macht `(fset SYMBOL KEYMAP)`?

7

Ich habe die Projektil-Quelldatei gelesen und sie machen Folgendes:

(defvar projectile-command-map
  (let ((map (make-sparse-keymap)))
    ; define-keys
    map)
  "Keymap for Projectile commands after `projectile-keymap-prefix'.")
(fset 'projectile-command-map projectile-command-map)

Warum machen sie das? Ist es für die Abwärtskompatibilität?

Czipperz
quelle
1
Ich bin mir sehr bewusst, wie Keymaps funktionieren, aber ich kann Ihnen nicht sagen, warum sie dies tun. Vielleicht möchten Sie sie fragen.
Stefan

Antworten:

9

fsetLegt die Funktionsdefinition eines Symbols fest .

Hier projectile-command-mapwird als Präfixbefehl verwendet . Ein Präfixbefehl ist ein Symbol, dessen Funktionsdefinition eine Keymap ist.

Die Definition eines Präfixschlüssels ist normalerweise die Schlüsselkarte, die zum Nachschlagen des folgenden Ereignisses verwendet wird. Die Definition kann auch ein Lisp-Symbol sein, dessen Funktionsdefinition die folgende Keymap ist. Der Effekt ist der gleiche, bietet jedoch einen Befehlsnamen für den Präfixschlüssel, der als Beschreibung des Verwendungszwecks des Präfixschlüssels verwendet werden kann.

Dies kann auch mit erfolgen define-prefix-command.

Was ist ein bisschen hier verwirrend ist , dass das gleiche Symbol , projectile-command-mapwird für zwei Zwecke verwendet werden:

  • Als Keymap
  • Als Präfixbefehl

Ein anderes Beispiel könnte klarer sein:

(fset 'help-command help-map)

Hier help-commandist eindeutig help-mapein Präfixbefehl , während es sich um eine Keymap handelt.

Tianxiang Xiong
quelle
Siehe auch C-h f defalias(ähnlich wie fset). Siehe (elisp) Präfix Keys für Informationen über Präfix - Befehle.
Drew
Was hier etwas verwirrend ist, ist, dass dasselbe Symbol für zwei Zwecke verwendet wird: Präfix- Keymap und Präfix- Befehl . Es wäre klarer, wenn es sich um zwei verschiedene Symbole handeln würde, wie bei help-commandundhelp-map .
Tianxiang Xiong
Vielleicht ja, aber das ist die gebräuchlichste Methode (ein Klischee) - verwenden Sie dasselbe Symbol. ( grepdenn fsetin den Lisp-Quellen dann M-x flush offsetund suchen nach map.)
Drew
1
Es ist üblich und ich würde den empfohlenen Weg sagen , um die Definition zusätzlicher Symbole zu vermeiden, aber es ist verwirrend für diejenigen, die nicht gut verstehen, wie Keymaps funktionieren. Ich habe den Kommentar nur expliziter für OP gemacht.
Tianxiang Xiong
Ja, ich verstehe, warum Sie den Kommentar abgegeben haben, und ich stimme zu, dass er verwirrend sein kann. Ich glaube nicht, dass der Grund darin besteht, zusätzliche Symbole zu vermeiden. Der Grund ist, dass dasselbe Symbol beide Verhaltensweisen genießt. Es ist ein Programmierklischee, aber die Beziehung zwischen den beiden (ob gleicher Name oder nicht) ist als solches dokumentiert. Es ist ein Befehl , daher kann er an einen Schlüssel gebunden werden. Es ist aber auch eine Variable , sodass es als Keymap fungieren kann. Das ist Lisp-2. ;-)
Drew