¿Qué significa (require 'package) para emacs y en qué se diferencia de load-file?

10

Acabo de comenzar a usar emacs hace unos días y leí en algún lugar que (require 'package-name)no es necesario cuando dicho paquete se instala usando package-install. Pero, ¿por qué no (require 'package-name)hacer realmente y cómo se diferencia de load-fileo loadprocedimientos?

Chakravarthy Raghunandan
fuente
77
Una de las primeras cosas que todos tuvimos que aprender en Emacs es M-x describe-functionleer la cadena de documentos. aka C-h fEscriba M-x describe-function RET require RETy lea la cadena de documentación. Luego escriba M-x describe-function RET load-file RETy lea la cadena de documentación. Luego escriba M-x describe-function RET load RETy lea la cadena de documentación. Después de leer las tres cadenas de documentos, edite su pregunta para comparar y contrastar las tres funciones y aclarar qué es lo que aún no comprende en relación con las mismas. Empleamos el mismo procedimiento para las variables - es decir, M-x describe-variable.
leyes el

Respuestas:

13

Si tiene loaduna biblioteca repetidamente, ese archivo se leerá y su código se evaluará repetidamente (cada vez que lo cargue).

Si tiene requireuna biblioteca repetidamente, lo hará loaduna vez (a lo sumo, y nada si la biblioteca ya se ha cargado).

requireproporciona esta eficiencia incluso si requireno se usó para cargar la biblioteca inicialmente, porque (la gran mayoría de) las bibliotecas contienen el código (provide 'FEATURE)para su FEATUREnombre particular . Ese código se evalúa cuando se carga la biblioteca, independientemente de cómo se cargó, y en ese momento actualiza los datos que se requirecomprueban al decidir si necesita hacer algo.

Principalmente desea usar requireen su propio código, si necesita asegurarse de que se haya cargado una biblioteca determinada.

La razón por la que a menudo no necesita hacer esto con los paquetes ELPA es que el administrador de paquetes procesa automáticamente las cookies de carga automática en el paquete y genera un archivo de carga automática para ese paquete. Cuando el sistema de paquetes se inicializa cuando inicia Emacs, se evalúa el archivo de carga automática para cada paquete, que identifica todas las funciones cargadas automáticamente. Cuando se llama a una función con carga automática, la biblioteca que contiene la definición real de la función se carga automáticamente.

Los autores de paquetes pueden agregar una cookie de carga automática a cada función a la que se espera que el usuario llame directamente y, por lo tanto, siempre que sus expectativas sean correctas, no necesitará llamar requireo cargar explícitamente el paquete para usarlo.

Tenga en cuenta que también puede definir sus propias cargas automáticas personalizadas. Consulte C-hig (elisp) Autoload RETy también (elisp) Hooks for Loadingsi desea utilizar la carga diferida personalizada y la configuración diferida de bibliotecas en su propia configuración. (Esto último dice "no evalúe este código hasta que se haya cargado esta biblioteca", lo que se relaciona muy bien con el mecanismo de carga automática "no cargar esta biblioteca hasta que sea necesario").

phils
fuente
2
Como ya está haciendo referencia al manual de Elisp, creo que otro nodo pertinente es (elisp) Named Features.
Basil