¿Cuándo debo usar la carga automática en lugar de requerir?


30

Por lo que entiendo, requirese usa para cargar grandes fragmentos de código (algo así como módulos) aunque también puede cargar funciones individuales.

La carga automática en el otro lado, solo registra funciones y difiere la carga al tiempo de ejecución.

Recientemente leí un artículo que aboga por el uso autoloadexclusivo.

¿Es mejor autoloadque que require? ¿Cuáles son algunos casos de uso típicos para cada uno de estos?


3
@Gilles: FWIW, no estoy de acuerdo con que hayas eliminado las etiquetas autoloady requirede esta pregunta. Agregar etiqueta librariesestaba bien, pero ahora cualquiera que busque, use etiquetas, para preguntas sobre autoloado requireno encontrará esta. Ambas son funciones importantes de Emacs-Lisp que las personas buscarán. Demasiado. Y piense cuán útil elispy libraries(especialmente elisp) será realmente en la práctica para un sitio de Emacs: me temo que no distinguen mucho en Emacsland. (Pero no, no estoy en contra de tenerlos y usarlos.)
Drew

@Drew Me voy por la meta discusión correspondiente . Si cree que este principio general no se aplica aquí, créelo en meta.
Gilles 'SO- deja de ser malvado'

1
@Gilles: Hecho . Sí, lo leí y pensé que eso era quizás lo que te había motivado. No estoy en desacuerdo con muchos principios generales. Eso no significa que seguirlos de manera general sea siempre TRT.
Drew

2
Estoy de acuerdo con Drew: dado que esta pregunta se trata específicamente de distinguir los casos de uso autoloady requirecreo que esas etiquetas están justificadas. De hecho, etiquetar esta pregunta [solo] con librarieses demasiado generalizante. Por mi parte, para requireactivar la carga de "my-foobar-cfg", que, como su nombre indica, solo contiene mi configuración, no una biblioteca.
pimentón

Respuestas:


28

autoloadno es un sustituto de require. Normalmente requirese usa para asegurarse de que se carga un determinado archivo. autoloadpor otro lado, le da a Emacs una pista sobre en qué archivo encontrar una función determinada sin cargar el archivo de inmediato. Solo cuando se llama a la función de carga automática se carga el archivo correspondiente.

Básicamente con autoloadusted puede retrasar la carga de un archivo completo hasta el momento en que realmente lo necesite. Esta es la razón por la cual los paquetes (especialmente grandes) generalmente definen sus funciones de entrada como autoloads.

Si desea hacer personalizaciones pesadas para un paquete, generalmente no tiene suerte autoload. Si todavía desea evitar require, puede diferir sus personalizaciones hasta después de que el archivo se haya cargado utilizando eval-after-load.

El manual de Emacs cubre este tema en las siguientes secciones:


2
Quizás valga la pena mencionar también: se autoloadtrata (más o menos) de proporcionar definiciones de comandos, por lo que puede usar esos comandos. requirese trata de hacer que todo en una biblioteca (y en las bibliotecas que la biblioteca requiere, de forma recursiva) esté disponible. Hay más en Emacs que comandos. (Pero sí, por supuesto, una vez que se invoca un comando autocargado, se carga toda su biblioteca).
Drew

4

En términos de inicialización de Emacs, no haga ninguna elección. El usuario de GitHub jwiegley tiene la excelente macro de declaración de paquete de uso , que requerirá o cargará automáticamente un paquete según lo determine la necesidad. Se utiliza mejor para diferir la carga de paquetes que se pueden cargar a pedido.


3

Si desea que una determinada característica se cargue y esté disponible directamente cuando su Emacs se haya iniciado, use require, de lo contrario use la carga automática. Personalmente valoro mucho el tiempo de inicio (en realidad reinicio Emacs un par de veces por semana, a veces varias veces por día), por lo que acepto que tomará un poco de tiempo cuando Emacs carga automáticamente una determinada función cuando la necesito. Entonces, piense en lo que desea que esté disponible directamente después de que se inicie Emacs y qué se puede cargar cuando sea necesario.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.