elisp – ¿Cómo lidiar con 'add-hook' en .emacs cuando se recarga más de una vez?

Pregunta:

Tengo algunas funciones de add-hook en mi .emacs similares a las de abajo,

Envía una notificación cuando se completa un pomodoro:

(add-hook 'org-pomodoro-finished-hook
  (lambda ()
      (message "Pomodoro finished")
))

Ahora, a veces cambio algo en estas funciones lambda que se ejecutaron desde el gancho y, a menudo, recargo todo el .emacs (como opuesto a una determinada región, etc.).

Como resultado, cuando pomodoro termina, recibo dos notificaciones. Parece que add-hook agrega dos funciones a la lista.

Desde un punto de vista de alto nivel, ¿cuál es la mejor manera de lidiar con esto?

[EDITAR / SOLUCIÓN]

Como se señaló en la respuesta, el add-hook solo agrega la función una vez si la función es idéntica a la definición anterior. El caso es que cambiar la función ya no la hace idéntica y, por lo tanto, se duplica la lista de ganchos.

Es decir, reevaluar esto no produce múltiples mensajes 'MEH':

(add-hook 'org-pomodoro-finished-hook
  (lambda ()
      (message "MEH")
))

Sin embargo, si cambio "MEH" a otra cosa (como "BLEH"), veré dos mensajes (MEH y BLEH).

La solución es apuntar add-hook a funciones y cambiar las funciones en lugar de cambiar los hooks.

En el siguiente ejemplo, "Meh" se puede cambiar a "Bleh", el .emacs se puede volver a cargar y solo se mostrará "Bleh".

(defun my/message ()
  (message "Meh")
)

(add-hook 'org-pomodoro-finished-hook 'my/message)

Respuesta:

No, add-hook solo agrega una entrada si aún no existe.

Es fácil confirmar esto en el búfer *scratch* :

(add-hook 'org-pomodoro-finished-hook
  (lambda ()
      (notification-send "Pomodoro finished")
))

Escriba Cj después del último par. Emacs evaluará la expresión y devolverá la lista resultante.

Ahora evalúelo de nuevo. Y otra vez.

Y para confirmar el valor de retorno, evalúe solo org-pomodoro-finished-hook

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım