¿Qué hace `(fset SYMBOL KEYMAP)`?

7

Estaba leyendo el archivo fuente del proyectil y hacen lo siguiente:

(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)

¿Por qué hacen esto? ¿Es por compatibilidad con versiones anteriores?

Czipperz
fuente
1
Soy muy consciente de cómo funcionan los mapas de teclas, pero no podría decirte por qué lo hacen. Puede que quieras preguntarles.
Stefan

Respuestas:

9

fsetestablece la definición de la función de un símbolo .

Aquí, projectile-command-mapse usa como un comando de prefijo . Un comando de prefijo es un símbolo cuya definición de función es un mapa de teclas.

La definición de una clave de prefijo suele ser el mapa de teclas que se utiliza para buscar el siguiente evento. La definición también puede ser un símbolo Lisp cuya definición de función es el siguiente mapa de teclas; el efecto es el mismo, pero proporciona un nombre de comando para la clave de prefijo que puede usarse como una descripción de para qué sirve la clave de prefijo.

Esto también se puede hacer con define-prefix-command.

¿Qué es un poco confuso aquí es que el mismo símbolo , projectile-command-map, se utiliza para dos fines:

  • Como un mapa de teclas
  • Como un comando de prefijo

Otro ejemplo puede ser más claro:

(fset 'help-command help-map)

Aquí, help-commandes claramente un comando de prefijo, mientras que help-mapes un mapa de teclas.

Tianxiang Xiong
fuente
Ver también C-h f defalias(similar a fset). Consulte (elisp) Prefix Keys para obtener información sobre los comandos de prefijo.
Dibujó
Lo que es un poco confuso aquí es que se utiliza el mismo símbolo para dos propósitos: prefijo keymap y prefix command . Sería más claro si fueran dos símbolos diferentes, como con help-commandyhelp-map .
Tianxiang Xiong
Tal vez sea así, pero esa es la forma más común de hacerlo (un cliché): use el mismo símbolo. ( greppara fseten las fuentes de Lisp, luego M-x flush offsety buscar map.)
Dibujó
1
Es común y diría la forma recomendada para evitar la definición de símbolos adicionales, pero es confuso para aquellos que no tienen una buena comprensión de cómo funcionan los mapas de teclas. Acabo de hacer que el comentario sea más explícito para OP.
Tianxiang Xiong
Sí, entiendo por qué hiciste el comentario, y estoy de acuerdo en que puede ser confuso. No creo que la razón sea para evitar símbolos adicionales. La razón es que el mismo símbolo disfrute de ambos comportamientos. Es un cliché de programación, pero la relación entre los dos (ya sea el mismo nombre o no) está documentada como tal. Es un comando , por lo que puede vincularse a una tecla. Pero también es una variable , por lo que puede actuar como un mapa de teclas. Este es Lisp-2. ;-)
Dibujó