O que o `(fset SYMBOL KEYMAP)` faz?

7

Eu estava lendo o arquivo de origem do projétil e eles fazem o seguinte:

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

Porque é que eles fazem isto? É para compatibilidade com versões anteriores?

Czipperz
fonte
11
Estou muito ciente de como os mapas de teclas funcionam, mas não sabia por que eles fazem isso. Você pode perguntar a eles.
Stefan

Respostas:

9

fsetdefine a definição da função de um símbolo .

Aqui, projectile-command-mapé usado como um comando de prefixo . Um comando prefix é um símbolo cuja definição de função é um mapa de teclas.

A definição de uma chave de prefixo geralmente é o mapa de teclas a ser usado para procurar o seguinte evento. A definição também pode ser um símbolo Lisp cuja definição de função é o seguinte mapa de teclas; o efeito é o mesmo, mas fornece um nome de comando para a chave de prefixo que pode ser usada como uma descrição do objetivo da chave de prefixo.

Isso também pode ser feito com define-prefix-command.

O que está um pouco confuso aqui é que o mesmo símbolo , projectile-command-map, está sendo usado para duas finalidades:

  • Como um mapa-chave
  • Como um comando prefixo

Outro exemplo pode ser mais claro:

(fset 'help-command help-map)

Aqui help-commandestá claramente um comando prefixo, enquanto help-mapé um mapa de teclas.

Tianxiang Xiong
fonte
Veja também C-h f defalias(semelhante a fset). Consulte (elisp) Teclas de prefixo para obter informações sobre comandos de prefixo.
Drew
O que é um pouco confuso aqui é que o mesmo símbolo está sendo usado para dois propósitos: prefix keymap e comando prefix . Seria mais claro se fossem dois símbolos diferentes, como com help-commandehelp-map .
Tianxiang Xiong
Talvez sim, mas essa é a maneira mais comum de fazer isso (um clichê) - use o mesmo símbolo. ( greppara fsetnas fontes Lisp e, em seguida, M-x flush offsetprocure map.)
Drew
11
É comum e eu diria a maneira recomendada para evitar a definição de símbolos extras, mas é confuso para aqueles que não têm uma boa compreensão de como os mapas de teclas funcionam. Acabei de tornar o comentário mais explícito para o OP.
Tianxiang Xiong
Sim, entendo por que você fez o comentário e concordo que pode ser confuso. Eu não acho que o motivo é evitar símbolos extras. O motivo é fazer com que o mesmo símbolo desfrute dos dois comportamentos. É um clichê de programação, mas a relação entre os dois (com o mesmo nome ou não) está documentada como tal. É um comando , portanto, pode ser vinculado a uma chave. Mas também é uma variável , portanto, pode atuar como um mapa-chave. Este é o Lisp-2. ;-)
Drew