Apéndice E Aspectos internos de GNU Emacs

Este capítulo describe cómo se vuelca el ejecutable de Emacs ejecutable con las bibliotecas Lisp precargadas en él, cómo se asigna el almacenamiento, y algunos aspectos internos de GNU Emacs que pueden ser de interés para los programadores de C.

E.1 Construir Emacs

Esta sección explica los pasos involucrados en la construcción del ejecutable de Emacs. No necesita conocer este material para construir e instalar Emacs, ya que los makefiles hacen todas estas cosas automáticamente. Esta información es pertinente para los desarrolladores de Emacs.

Construir Emacs requiere GNU Make versión 3.81 o posterior.

La compilación de los ficheros fuente C en el directorio src produce un archivo ejecutable llamado temacs, también llamado Emacs depurado. Contiene el intérprete Emacs Lisp y las rutinas de E/S, pero no los comandos de edición.

El comando temacs -l loadup ejecutaría temacs y le indicaría que cargara loadup.el. La biblioteca loadup carga bibliotecas Lisp adicionales, que configuran el entorno de edición normal de Emacs. Después de este paso, el ejecutable de Emacs ya no está vacío.

Debido a que lleva algún tiempo cargar los archivos Lisp estándar, el ejecutable temacs no suele ser ejecutado directamente por los Usuarios. En su lugar, uno de los últimos pasos de la construcción de Emacs ejecuta el comando temacs -batch -l loadup --temacs=dump-method. La opción especial --temacs indica a temacs cómo registrar todas las funciones y variables Lisp estándar precargadas, de modo que cuando posteriormente ejecute Emacs, éste se iniciará mucho más rápido. La opción --temacs requiere un argumento dump-method, que puede ser uno de los siguientes:

pdump

Registra los datos Lisp precargados en un archivo de volcado. Este método produce un fichero de datos adicional que Emacs cargará al arrancar. El fichero de volcado producido se llama normalmente emacs.pdmp, y se instala en el directorio exec de Emacs (ver Funciones de Ayuda). Este método es el más preferido, ya que no requiere que Emacs emplee ninguna técnica especial de asignación de memoria, que podría interponerse en el camino de varias técnicas de disposición de memoria usadas por los sistemas modernos para mejorar la seguridad y la privacidad.

pbootstrap

Como pdump, pero usado durante el arranque de Emacs, cuando no se dispone de un binario Emacs previo ni de ficheros *.elc byte-compiled Lisp. En este caso, el archivo de volcado producido suele llamarse bootstrap-emacs.pdmp.

dump

Este método hace que temacs vuelque un programa ejecutable, llamado emacs, que tiene todos los archivos Lisp estándar ya precargados en él. (El argumento -batch evita que temacs intente inicializar cualquiera de sus datos en el terminal, de modo que las tablas de información del terminal están vacías en el Emacs volcado). Este método también se conoce como unexec, porque produce un archivo de programa a partir de un proceso en ejecución, y por tanto es en cierto sentido lo contrario de ejecutar un programa para iniciar un proceso. Aunque este método era la forma en que Emacs tradicionalmente guardaba su estado, ahora está obsoleto.

bootstrap

Como dump, pero usado cuando se arranca Emacs con el método unexec.

El ejecutable emacs volcado (también llamado Emacs puro) es el que se instala. Si se usó el programa volcador portable (dumper) para construir Emacs, el ejecutable emacs es en realidad una copia exacta de temacs, y el correspondiente archivo emacs.pdmp se instala también. La variable preloaded-file-list almacena una lista de los archivos Lisp precargados registrados en el archivo dump o en el ejecutable Emacs volcado. Si porta Emacs a un nuevo sistema operativo, y no puede implementar ningún tipo de volcado, entonces Emacs deberá cargar loadup.el cada vez que se inicie.

Por defecto, el ejecutable emacs volcado registra detalles como la hora de compilación y el nombre del host. Usa la opción --disable-build-details de configure para suprimir estos detalles, de forma que construir e instalar Emacs dos veces desde las mismas fuentes sea más probable que resulte en copias idénticas de Emacs.

Puede especificar archivos adicionales para precargar escribiendo una librería llamada site-load.el que los cargue. Puede que necesite reconstruir Emacs con una definición añadida

#define SITELOAD_PURESIZE_EXTRA n

para añadir n bytes de espacio puro para alojar los archivos adicionales; véase src/puresize.h. (Pruebe a añadir incrementos de 20000 hasta que sea lo suficientemente grande.) Sin embargo, la ventaja de precargar archivos adicionales disminuye a medida que las máquinas se hacen más rápidas. En máquinas modernas, no suele ser aconsejable.

Después de que loadup.el lea site-load.el, encuentra las cadenas de documentación para las funciones primitivas y precargadas (y variables) en el archivo etc/DOC donde están almacenadas, llamando a Snarf-documentation (ver Acceso a la Documentación).

Puede especificar otras expresiones Lisp para ejecutar justo antes del volcado poniéndolas en una biblioteca llamada site-init.el. Este archivo se ejecuta después de encontrar las cadenas de documentación.

Si quiere precargar definiciones de funciones o variables, hay tres formas de hacerlo y hacer que sus cadenas de documentación sean accesibles cuando ejecutes Emacs posteriormente:

  • Prepárese para escanear estos archivos cuando produzca el archivo etc/DOC, y cárguelos con site-load.el.

  • Cargue los archivos con site-init.el, luego copie estos archivos en el directorio de instalación para ficheros Lisp cuando instale Emacs.

  • Especifique un valor nil para byte-compile-dynamic-docstrings como variable local en cada uno de estos archivos, y cárguelos con site-load.el o site-init.el. (Este método tiene el inconveniente de que las cadenas de documentación ocupan espacio en Emacs todo el tiempo).

No es aconsejable poner nada en site-load.el o site-init.el que pueda alterar cualquiera de las características que los Usuarios esperan en un Emacs normal sin modificar. Si cree que debe anular las características normales de su sitio, hágalo con default.el, para que los Usuarios puedan anular sus cambios si lo desean. Vea Resumen: Secuencia de Acciones al Inicio. Tenga en cuenta que si site-load.el o site-init.el cambia load-path, los cambios se perderán después del volcado. Véase Búsqueda en la Biblioteca. Para realizar un cambio permanente en la ruta de carga, utilice la opción --enable-locallisppath de configure.

En un paquete que puede ser precargado, a veces es necesario (o útil) retrasar ciertas evaluaciones hasta que Emacs se inicie posteriormente. La gran mayoría de estos casos están relacionados con los valores de variables personalizables. Por ejemplo, tutorial-directory es una variable definida en startup.el, que se precarga. El valor por defecto se establece en base a data-directory. La variable necesita acceder al valor de data-directory cuando Emacs arranca, no cuando es volcado, porque el ejecutable de Emacs probablemente ha sido instalado en una localización diferente desde que fue volcado.

Función: custom-initialize-delay valor del símbolo

Esta función retrasa la inicialización del símbolo hasta el siguiente inicio de Emacs. Normalmente se usa esta función especificándola como la propiedad :initialize de una variable personalizable. (El valor del argumento no se usa, y se proporciona sólo por compatibilidad con la forma que espera Custom).

En el improbable caso de que necesite una funcionalidad más general que la que proporciona custom-initialize-delay, puede usar before-init-hook (ver Resumen: Secuencia de Acciones en el Arranque).

Función: dump-emacs-portable a-archivo &opcional seguimiento-de-referencias

Esta función vuelca el estado actual de Emacs en un archivo de volcado a-file, usando el método pdump. Normalmente, el fichero de volcado se llama emacs-name.dmp, donde emacs-name es el nombre del archivo ejecutable de Emacs. El argumento opcional seguimiento-de-referencias, si no es nulo, hace que el archivo portable que lo vuelca guarde información adicional para ayudar a rastrear la procedencia de tipos de objetos que aún no están soportados por el método pdump.

Aunque el código del volcador portable puede ejecutarse en muchas plataformas, los archivos de volcado que produce no son portables, sólo pueden ser cargados por el ejecutable de Emacs que los volcó.

Si quiere usar esta función en un Emacs que ya ha sido volcado, debe ejecutar Emacs con la opción -batch.

Si está incluyendo ficheros .el en el Emacs volcado y ese archivo .el tiene código que normalmente se ejecuta en tiempo de carga, ese código no se ejecutará cuando Emacs se inicie después del volcado. Para ayudar a solucionar este problema, puede poner funciones en el gancho after-pdump-load-hook. Este gancho se ejecuta al arrancar Emacs.

Función: dump-emacs a-archivo desde-archivo

Esta función vuelca el estado actual de Emacs en un fichero ejecutable to-file, usando el método unexec. Toma símbolos de from-file (normalmente es el archivo ejecutable temacs).

Esta función no puede usarse en un Emacs que ya haya sido volcado. Esta función está obsoleta, y por defecto Emacs se construye sin soporte unexec por lo que esta función no está disponible.

Function: pdumper-stats

Si la sesión actual de Emacs restauró su estado desde un archivo de volcado, esta función devuelve información sobre el archivo de volcado y el tiempo que se tardó en restaurar el estado de Emacs. El valor es una lista ((dumped-with-pdumper . t) (load-time . tiempo) (dump-file-name . archivo)), donde archivo es el nombre del fichero de volcado, y tiempo es el tiempo en segundos que se tardó en restaurar el estado desde el fichero de volcado. Si la sesión actual no se restauró a partir de un archivo de volcado, el valor es nulo.