O que é um gancho?

8

Apenas para esclarecer ... Por exemplo, neste documento :

Um gancho é uma variável Lisp que contém uma lista de funções, a serem chamadas em alguma ocasião bem definida. (Isso é chamado de execução do gancho.) As funções individuais na lista são chamadas de funções de gancho do gancho. Por exemplo, o gancho kill-emacs-hooké executado antes de sair do Emacs ...

Eu acho que está dizendo que existe uma variável (símbolo) nomeada kill-emacs-hookque representa uma lista de um conjunto de "funções de gancho" que serão executadas quando a kill-emacs-hookavaliação for realizada, executando essas funções. Corrigir? Então

(add-hook 'text-mode-hook 'auto-fill-mode)

está sendo adicionado auto-fill-modeà lista identificada por text-mode-hook, além do que já está lá. Boa. Agora isso

(defcustom text-mode-hook nil
  "Normal hook run when entering Text mode and many related modes."
  :type 'hook
  :options '(turn-on-auto-fill flyspell-mode)
  :group 'wp)

onde parece que estamos criando ou alterando o text-mode-hook. Agora estou confuso quanto à natureza dos ganchos e ao relacionamento deles defcustom. Minha escolha lógica é que esse código esteja criando uma variável text-mode-hookdo tipo "(não sei o que significa tipos no elisp) hook. Esta é, de fato, a criação inicial do gancho text-mode-hook? Se sim, o que há com as "opções"? Essas são as supostas funções de gancho ou algo mais?

147pm
fonte
11
No seu link: «A palavra-chave: options especifica uma lista sugerida de valores para a variável. Normalmente, as opções: aplicam-se a um gancho. A lista é apenas uma sugestão; não é exclusivo; uma pessoa que define a variável pode defini-la com outros valores; a lista mostrada após a palavra-chave: options tem como objetivo oferecer opções convenientes a um usuário. »
The Sidhekin

Respostas:

6

Sua compreensão da noção de gancho do Emacs Lisp está absolutamente correta. De fato, ganchos "normais" são apenas listas de funções (todas as funções não aceitam argumentos, caso contrário, geralmente não são chamadas de "gancho" ou "gancho normal" no Emacs Lisp).

A maioria dessas variáveis ​​tem nomes que terminam com -hook. São ganchos normais, executados por meio de run-hooks. O valor desse gancho é uma lista de funções; as funções são chamadas sem argumentos e seus valores são completamente ignorados. A maneira recomendada de colocar uma nova função nesse gancho é ligar add-hook.

As variáveis ​​cujos nomes terminam -functionsgeralmente são ganchos anormais (algum código antigo também pode usar o -hookssufixo obsoleto ); seus valores são listas de funções, mas essas funções são chamadas de maneira especial (são argumentos passados ​​ou são usados ​​seus valores de retorno). As variáveis ​​cujos nomes terminam -functiontêm funções únicas como seus valores.

A interface de personalização é uma coisa diferente. Toda a diferença entre defvare defcustomé que este último permite ao usuário editar a variável através da interface "customizar". Esta interface pode facilitar a edição de certos tipos de dados, por exemplo, se você está dizendo que :typede text-mode-hooké hook, em seguida, interface de personalização torna-se de que text-mode-hooké sempre uma lista de funções. Além disso, você pode especificar quais opções são recomendadas com :optionsargumento.

Portanto, seu entendimento está correto e defcustomsuas opções são apenas uma maneira de instruir o Emacs, para que ele possa ajudar melhor o usuário quando ele usa a interface "personalizar".

Mark Karpov
fonte
Mas esse exemplo de a defcustomnão é ótimo porque text-mode-hookjá existe; já está incluído. Direita? Agora, se eu escrevesse meu próprio modo e desejasse personalização, faria isso. Minha confusão é que este exemplo está realmente criando text-mode-hook, não alterando. Essa é uma compreensão correta? E se isso realmente está criando um novo text-mode-hook, :optionsestá oferecendo essas duas funções como opções para fazer um add-hookna lista, certo?
147pm 30/08/2015
@ 147pm, este exemplo mostra apenas como uma parte do código existente do Emacs define variável personalizável que representa hook. Em poucas palavras, defcustomapenas define novas variáveis. Neste exemplo em particular, text-mode-hooké criado e seu valor inicial é nil. A interface de personalização também informa que os valores recomendados a serem incluídos nesta lista são turn-on-auto-fille flyspell-mode. No entanto, você pode definir o text-mode-hookque quiser programaticamente, é uma variável normal. Você também pode usar add-hookcom outras funções.
Mark Karpov
@ 147, em outras palavras, todos os argumentos de palavras-chave são apenas sugestões para o sistema de personalização, eles não fazem diferença fora dele. Sem as dicas que esse código representa (defvar text-mode-hook nil).
Mark Karpov
Mas é assim defcustomque o gancho está sendo criado inicialmente? É assim que parece. Em outras palavras, este exemplo é tirado do fundo das entranhas do código Emacs em algum lugar.
147pm 30/08/2015
@ 147pm, sim, correto.
Mark Karpov