Autoloads y variables

8

Entiendo lo que hace la carga automática para las funciones (registrar el archivo para cargar cuando se llama a dicha función o se recupera su cadena de documentación). Sin embargo, no está claro cómo usar la función de carga automática junto con variables y macros.

Tengo dos preguntas:

  1. ¿Qué sucede cuando el paquete tiene un parámetro, implementado como una variable que el usuario puede establecer, pero no se carga automáticamente? ¿Deberían esas variables cargarse automáticamente? De lo contrario, resulta que tales variables no existen, el entorno Lisp no sabe nada de ellas, incluidos sus valores predeterminados, hasta que se utiliza alguna función de carga automática del paquete (generalmente después de cargar los archivos de configuración), entonces si el usuario las configura en su / su archivo de configuración, es como establecer una variable no existente. Si el valor de la variable es una lista no vacía y el usuario usa pusho add-to-listpara cambiar su valor, ¿qué sucede exactamente? ¿Se pierden los valores predeterminados?

  2. ¿Qué sucede cuando una macro se carga automáticamente? ¿Cuándo deberíamos cargar automáticamente una macro?

Mark Karpov
fuente

Respuestas:

5

La carga automática solo se aplica a la ranura de valor de función de un símbolo. En particular, no existe la carga automática de una variable.

Probablemente sea una mala forma que un paquete contenga variables para la personalización del usuario cuyo valor predeterminado es una lista no vacía, precisamente porque en ese caso se hace difícil personalizar la variable. Peor aún, si el valor predeterminado cambiara, el valor personalizado probablemente también debería cambiar, sin embargo, el usuario no lo sabrá. Si algún paquete tiene tales variables, puede ser mejor alterarlo después de que el paquete se haya cargado, usando eval-after-load.

La mayoría de las variables de personalización tendrán un valor predeterminado de nil, en cuyo caso solo las configurará setqen su archivo init (o usará la interfaz de personalización). Suponiendo que el paquete usa defvaro defcustompara establecer la variable, como debería, no anulará su configuración.

Macros de carga automática: establezca el quinto argumento de autoloadpara lograr esto. Al igual que las funciones, esto debe hacerse si es probable que desee usar la macro sin cargar primero el paquete, ya sea explícita o implícitamente invocando otros símbolos cargados automáticamente desde el paquete.

Anexo: Como el OP señaló en los comentarios, un ;;;###autoloadcomentario mágico también copiará un defvar(de hecho, cualquier forma de elisp) en el archivo de carga automática. Consulte la sección Carga automática en el manual de elisp para más detalles.

Harald Hanche-Olsen
fuente
Por lo tanto, las variables que se pueden setqeditar (es decir, no importa qué valores tengan antes) pueden tener un valor predeterminado especificado en defvaro en defcustomforma, pero en el caso de una lista que el usuario pueda extender, es mejor usarla, eval-after-load¿verdad? Además, a veces los valores predeterminados buenos son buenos, incluso si toman la forma de una lista ;-)
Mark Karpov
Así es. Yo diría que si una personalización común requiere eval-after-load, es un error en la implementación del paquete. Por lo general, eval-after-loaddebe usarse para corregir errores o personalizaciones muy inusuales. Por cierto, puede ser mejor usar un gancho si el paquete lo tiene disponible.
Harald Hanche-Olsen
El problema es que quería tener una variable vinculada a una lista de tres elementos (valores predeterminados). Los valores predeterminados son lo que la mayoría de los usuarios quieren, estoy seguro. ¡Pero si sigo adelante eval-after-load, los usuarios aún no podrán eliminar elementos de la lista! Esto me hace preguntarme si debería abandonar los valores predeterminados.
Mark Karpov
1
No estoy de acuerdo en que eval-after-loadsea ​​necesario solo para situaciones inusuales. Es una de las herramientas estándar en el kit de herramientas de carga diferida. Si las personas no quieren usar tales herramientas, pueden usar requirela biblioteca desde el principio (que es lo que siempre se recomienda hacer a los recién llegados) cuando lleguen a pensar "Me gustaría que Emacs comenzara un poco más rápido", " probablemente ha aprendido lo suficiente como para no se asuste con la nueva sintaxis :)
PHILS
1
@Drew: Tu punto de usar en customize-set-variablelugar de usar setqpuede ser bueno. Pero no tengo el tiempo ahora para el estudio cuidadoso requerido para mejorar mi respuesta a este respecto. Si crees que esto es importante, ¿por qué no escribes tu propia respuesta? Será más visible que este largo hilo de comentarios.
Harald Hanche-Olsen