49 Paquetes Emacs Lisp
Emacs se amplía implementando características adicionales en paquetes, que son bibliotecas Emacs Lisp. Estas pueden ser escritas por Usted o proporcionadas por alguien más. Si quiere instalar tal paquete para que esté disponible en su futura sesión de Emacs, necesita compilarlo y ponerlo en un directorio donde Emacs busque bibliotecas Lisp. Vea 28.8 Bibliotecas de Código Lisp para Emacs, para más detalles sobre este método de instalación manual. Muchos paquetes proporcionan instrucciones de instalación y uso en el gran comentario cerca del principio del archivo Lisp; puede usar esas instrucciones para instalar y afinar el uso del paquete.
Los paquetes también pueden ser proporcionados por archivos de paquetes, que son grandes colecciones de paquetes Emacs Lisp. Cada paquete es un programa Emacs Lisp independiente, que a veces incluye otros componentes como un manual de información. Emacs incluye una herramienta que le permite descargar e instalar fácilmente paquetes de dichos archivos. El resto de este capítulo describe esta herramienta.
Para listar los paquetes disponibles para su instalación desde archivos de paquetes, escriba Alt-x list-packages
RETURN (M-x list-packages RET
). Aparecerá un búfer llamado *Packages*
(Paquetes) con una lista de todos los paquetes. Puede instalar o desinstalar paquetes a través de este búfer. Ver 49.1 El Menú de Paquetes.
El comando C-h P
(describe-package
) pide el nombre de un paquete y muestra un búfer de ayuda describiendo los atributos del paquete y las características que implementa.
Por defecto, Emacs descarga paquetes de un archivo de paquetes mantenido por los desarrolladores de Emacs y alojado por el proyecto GNU. Opcionalmente, también puede descargar paquetes de archivos mantenidos por terceros. Ver 49.3 Instalación de Paquetes.
Para más información sobre cómo convertir un programa Emacs Lisp en un paquete instalable, vea Empaquetado en el Manual de Referencia de Emacs Lisp.
49.2 Estados de los Paquetes
Un paquete puede tener uno de los siguientes estados:
available
(disponible)El paquete no está instalado, pero puede descargarse e instalarse desde el archivo del paquete.
avail-obso
(disponible pero obsoleto)El paquete está disponible para su instalación, pero también existe una versión más reciente. Los paquetes con este estado están ocultos por defecto.
built-in
(ya incorporado en el Editor)El paquete está incluido en Emacs por defecto. No se puede eliminar a través del menú de paquetes, y por defecto no se tiene en cuenta para la actualización (pero se puede cambiar personalizando
package-install-upgrade-built-in
, ver 49.3 Instalación de Paquetes).dependency
(dependencia)El paquete se instaló automáticamente para satisfacer una dependencia de otro paquete.
disable
(deshabilitado)El paquete se ha desactivado mediante la variable
package-load-list
.external
(externo)El paquete no está incorporado y no procede del directorio especificado por package-user-dir (consulte 49.4. Archivos de Paquete y Ddistribución de Directorios Archivos de Paquete y disposición de directorios). Los paquetes externos se tratan de forma muy similar a los paquetes «integrados» y no se pueden eliminar.
held
El paquete se mantiene en una determinada versión, Ver 49.3 Instalación de Paquetes.
incompat
(incompatible)El paquete no puede instalarse por alguna razón, por ejemplo porque depende de paquetes desinstalables.
installed
(instalado)El paquete está instalado.
new
(nuevo)Equivale a
available
(disponible), excepto en que el paquete está disponible en el archivo de paquetes desde la última vez que invocóM-x list-packages
.obsolete
(obsoleto)El paquete es una versión instalada obsoleta; además de esta versión del paquete, también está instalada una versión más reciente.
49.3 Instalación de Paquetes
Los paquetes se instalan de forma más eficiente usando el menú de paquetes (ver 49.1 El Menú de Paquetes), pero también puede usar el comando M-x package-install
. Este comando solicita el nombre de un paquete con el estado available
(disponible) luego lo descarga y lo instala. Del mismo modo, si desea actualizar un paquete, puede utilizar el comando M-x package-upgrade
, y si desea actualizar todos los paquetes, puede utilizar el comando M-x package-upgrade-all
.
Por defecto, package-install
no tiene en cuenta los paquetes integrados cuyas nuevas versiones están disponibles en los archivos. (Un paquete está incorporado si está incluido en la distribución de Emacs.) En particular, no mostrará los paquetes incorporados en la lista de candidatos a ser completados cuando escriba en su prompt. Pero si invoca package-install
con un argumento prefijo, también considerará los paquetes incorporados que puedan ser actualizados. Puede hacer que este comportamiento sea el predeterminado personalizando la variable package-install-upgrade-built-in
: si su valor no es nulo, package-install
considerará los paquetes incorporados incluso cuando se invoque sin un argumento de prefijo. Tenga en cuenta que las órdenes del menú de paquetes (vea 49.1 El Menú de Paquetes) también se ven afectadas por package-install-upgrade-built-in
.
Por el contrario,``package-upgrade`` y package-upgrade-all
nunca tienen en cuenta los paquetes incorporados. Si desea utilizar estos comandos para actualizar algunos paquetes incorporados, necesita actualizar cada uno de ellos, una vez, ya sea mediante C-u M-x package-install RET
, o personalizando package-install-upgrade-built-in
a un valor no nulo, y luego actualizar el paquete una vez mediante el menú de paquetes, o mediante package-install
.
Si personaliza package-install-upgrade-built-in
a un valor no nulo, tenga mucho cuidado al usar comandos que actualizan muchos paquetes a la vez, como package-upgrade-all
y U
en el menú de paquetes: podrían sobrescribir paquetes incorporados que no pretendía reemplazar con versiones más recientes de los archivos. No utilice estos comandos de actualización masiva si sólo desea actualizar un pequeño número de paquetes incorporados.
Un paquete puede requerir la instalación de otros paquetes, porque depende de la funcionalidad proporcionada por ellos. Cuando Emacs instala un paquete, también descarga e instala automáticamente cualquier paquete necesario que no esté ya instalado. (Si un paquete requerido no está disponible de alguna manera, Emacs señala un error y detiene la instalación). La lista de requisitos de un paquete se muestra en su buffer de ayuda.
Por defecto, los paquetes se descargan de un único archivo de paquetes mantenido por los desarrolladores de Emacs. Esto se controla mediante la variable package-archives
, cuyo valor es una lista de archivos de paquetes conocidos por Emacs. Cada elemento de la lista debe tener la forma (id . location
), donde id es el nombre de un archivo de paquetes y location es la URL o nombre del directorio del archivo de paquetes. Puede alterar esta lista si desea usar archivos de paquetes de terceros, pero hágalo bajo su propia responsabilidad, y use sólo los de terceros en los que crea que puede confiar.
Los mantenedores de los archivos de paquetes pueden aumentar la confianza que puede tener en sus paquetes firmándolos. Generan un par de claves criptográficas privada/pública y utilizan la clave privada para crear un archivo de firma para cada paquete. Con la clave pública, puede utilizar los archivos de firma para verificar al creador del paquete y asegurarte de que el paquete no ha sido manipulado. La verificación de firmas utiliza el paquete GnuPG a través de la interfaz EasyPG (ver EasyPG en el Manual del Asistente EasyPG de Emacs). Una firma válida no es una garantía irrefutable de que un paquete no sea malicioso, por lo que debe ser precavido. Los archivos de paquetes deberían proporcionar instrucciones sobre cómo obtener su clave pública. Una forma es descargar la clave de un servidor como https://pgp.mit.edu/. Use M-x package-import-keyring
para importar la clave a Emacs. El Editor almacena las claves de los paquetes en el directorio especificado por la variable package-gnupghome-dir
, por defecto en el subdirectorio gnupg
de package-user-dir
, lo que hace que Emacs invoque GnuPG con la opción --homedir
al verificar las firmas. Si package-gnupghome-dir
es nil
, la opción --homedir
de GnuPG se omite. La clave pública para el archivo de paquetes GNU se distribuye con Emacs, en el etc/package-keyring.gpg
. Emacs la usa automáticamente.
Si la opción de Usuario package-check-signature
no es nula, Emacs intenta verificar las firmas cuando instala paquetes. Si la opción tiene el valor allow-unsigned
, y se encuentra una configuración OpenPGP utilizable, se comprobarán los paquetes firmados, pero aún puede instalar un paquete que no esté firmado. Si utiliza algunos archivos que no firman sus paquetes, puede añadirlos a la lista package-unsigned-archives
. (Si el valor es allow-unsigned
y no se encuentra ningún OpenPGP utilizable, esta opción se trata como si su valor fuera nil
). Si el valor es t
, al menos una firma debe ser válida; si el valor es all
, todas deben ser válidas.
Para más información sobre claves criptográficas y firmas, vea GnuPG en The GNU Privacy Guard Manual. Emacs viene con una interfaz para GNU Privacy Guard, ver EasyPG en Emacs EasyPG Assistant Manual.
Si tiene más de un archivo de paquetes habilitado, y algunos de ellos ofrecen diferentes versiones del mismo paquete, puede encontrar útil la opción package-pinned-packages
. Puede añadir pares paquete/archivo a esta lista, para asegurarse de que el paquete especificado sólo se descarga del archivo especificado.
Otra opción útil cuando tiene varios archivos de paquetes activados es package-archive-priorities
. Especifica la prioridad de cada archivo (los números más altos indican archivos de mayor prioridad). Por defecto, los archivos tienen prioridad cero, a menos que se especifique lo contrario en el valor de esta opción. Los paquetes de los archivos de menor prioridad no se mostrarán en el menú si el mismo paquete está disponible en un archivo de mayor prioridad. (Esto se controla mediante el valor de package-menu-hide-low-priority
).
Una vez que un paquete se ha descargado, compilado en bytes e instalado, se pone a disposición de la sesión actual de Emacs. Hacer que un paquete esté disponible añade su directorio a load-path
y carga sus autoloads (función que permite carga automática de otras funciones o paquetes). El efecto de estos autoloads varía de un paquete a otro. La mayoría de los paquetes sólo hacen disponibles algunos comandos nuevos, mientras que otros tienen efectos más amplios en la sesión de Emacs. Para más información, consulta la ayuda del paquete.
A los paquetes instalados automáticamente, Emacs los pone a disposición en todas las sesiones posteriores. Esto ocurre en el arranque, antes de procesar el archivo init pero después de procesar el archivo de inicio del Editor (ver 50.4.6. El Archivo de Inicio Temprano excepción, Emacs no hace disponibles los paquetes al inicio si se invoca con las opciones -q
o --no-init-file
(ver C.2 Opciones Iniciales).
Para evitar que Emacs haga automáticamente disponibles los paquetes al inicio, cambie la variable package-enable-at-startup
a nil
. Debe hacer esto en el archivo de inicio automático, ya que la variable se lee antes de cargar el archivo de inicio del Editor. Actualmente esta variable no puede establecerse a través de Personalizar.
Si tiene muchos paquetes instalados, puede mejorar los tiempos de arranque estableciendo la opción de usuario package-quickstart
a t
. Establecer esta opción hará que Emacs precalcule muchas cosas en lugar de recalcularlas en cada arranque de Emacs. Sin embargo, si hace esto, tendrá que ejecutar manualmente el comando package-quickstart-refresh
cuando las activaciones necesiten ser cambiadas, como cuando cambia el valor de package-load-list
.
Si ha establecido package-enable-at-startup
como nil
, puede hacer que los paquetes estén disponibles durante o después del inicio. Para que los paquetes instalados estén disponibles durante el arranque, llame a la función package-activate-all
en su archivo de inicio. Para que los paquetes instalados estén disponibles después del arranque, invoque el comando M-:
package-activate-all RET
.
Para un control más preciso sobre qué paquetes están disponibles al inicio, puede utilizar la variable package-load-list
. Su valor debe ser una lista. Un elemento de lista de la forma (nombre versión) le dice a Emacs que haga disponible la versión del paquete llamado nombre. Aquí, versión debe ser una cadena de versión (correspondiente a una versión específica del paquete), o t
(que significa hacer disponible cualquier versión instalada), o nil
(que significa ninguna versión; esto desactiva el paquete, impidiendo que esté disponible). Un elemento de la lista también puede ser el símbolo all, que significa poner a disposición la última versión instalada de cualquier paquete no nombrado por los otros elementos de la lista. El valor por defecto es '(all)
.
Por ejemplo, si establece package-load-list
a '((muse "3.20") all)
, entonces Emacs sólo hace disponible la versión 3.20 del paquete muse
, además de cualquier versión instalada de paquetes que no sean muse
. Cualquier otra versión de muse
que esté instalada será ignorada. El paquete muse
aparecerá en el menú de paquetes con el estado held
(retenido o congelado en esa versión).
El código byte de Emacs es bastante estable, pero es posible que se quede obsoleto, o que los archivos compilados dependan de macros que han cambiado en nuevas versiones de Emacs. Puede usar el comando M-x package-recompile
para recompilar un paquete en particular, o M-x package-recompile-all
para recompilar todos los paquetes. (Este último comando puede tardar bastante en ejecutarse si tienes muchos paquetes instalados).
49.4. Archivos de Paquete y Ddistribución de Directorios
Cada paquete se descarga del archivo de paquetes en forma de un único archivo de paquete, ya sea un fichero fuente de Emacs Lisp o un fichero tar que contiene múltiples ficheros fuente de Emacs Lisp y otros archivos. Los archivos de paquete son automáticamente recuperados, procesados y eliminados por los comandos de Emacs que los instalan. Normalmente, no necesitará tratar directamente con ellos, a menos que esté haciendo un paquete (ver Empaquetado en el Manual de Referencia de Emacs Lisp). Si alguna vez necesita instalar un paquete directamente desde un archivo de paquete, use el comando M-x package-install-file
.
Una vez instalado, el contenido de un paquete se coloca en un subdirectorio de ~/.emacs.d/elpa/
(puede cambiar el nombre de ese directorio cambiando la variable package-user-dir
). El subdirectorio del paquete se llama nombre-versión, donde nombre es el nombre del paquete y versión es su cadena de caracteres que corresponde a la versión.
Además de package-user-dir
, Emacs busca los paquetes instalados en los directorios listados en package-directory-list
. Estos directorios están pensados para que los package-directory-list
hagan que los paquetes de Emacs estén disponibles en todo el sistema; el Editor nunca instala paquetes allí. Los subdirectorios de paquetes para package-user-dir
están dispuestos de la misma manera que en paquete-usuario-dir
.
Borrar un paquete (ver 49.1 El Menú de Paquetes) implica borrar el subdirectorio de paquetes correspondiente. Esto sólo funciona para paquetes instalados en package-use-dir
si se le dice que actúe sobre un paquete en un directorio de paquetes de todo el sistema, la orden de borrado señala un error.
49.5. Obtener las Fuentes de los Paquetes
Por defecto package-install
descarga un Tarball de un archivo de paquetes e instala sus ficheros. Esto puede ser inadecuado si desea hackear las fuentes del paquete y compartir sus cambios con otros. En ese caso, es posible que prefiera obtener directamente el código fuente y trabajar en él. Esto suele facilitar el desarrollo de parches y la notificación de errores.
Una forma de hacerlo es utilizar package-vc-install
, para obtener el código fuente de un paquete directamente de la fuente. El comando también se asegurará automáticamente de que todos los archivos sean compilados en bytes y cargados automáticamente, al igual que con un paquete normal. Los paquetes instalados de esta forma se comportan como cualquier otro paquete. Puede actualizarlos usando package-upgrade
o package-upgrade-all
y borrarlos de nuevo usando package-delete
. Incluso se muestran en el listado de paquetes normales. Si sólo desea clonar el código fuente de un paquete, sin añadirlo a la lista de paquetes, utilice package-vc-checkout
.
Con la comprobación del código fuente, es posible que desee reproducir un error contra la versión de desarrollo actual o implementar una nueva característica para satisfacer un requisito. Si los metadatos del paquete indican cómo ponerse en contacto con el responsable, puede utilizar la orden package-report-bug
para informar de un error por correo electrónico. Este informe incluirá todas las opciones de usuario que haya personalizado. Si ha realizado un cambio que desea compartir con los mantenedores, primero confirme sus cambios y luego utilice la orden package-vc-prepare-patch
para compartirlo. Consulte 29.1.12.6. Preparación de Parches.
Si mantiene sus propios paquetes, puede que quiera usar una comprobación local en lugar de clonar un repositorio remoto. Puede hacerlo usando package-vc-install-from-checkout
, que crea un enlace simbólico desde el directorio del paquete (vea 49.4. Archivos de Paquete y Ddistribución de Directorios) a su checkout e inicializa el código. Tenga en cuenta que podría tener que usar package-vc-rebuild
para repetir la inicialización y actualizar las autocargas.
49.5.1 Especificar las Fuentes de los Paquetes
Para instalar un paquete desde el código fuente, Emacs debe saber dónde obtener el código fuente del mismo (como un repositorio de código) e información básica sobre la estructura del código (como el fichero principal en un paquete multi-fichero). La especificación de un paquete describe estas propiedades.
Cuando es soportado por un archivo de paquetes (ver Archivos de Paquetes en el Manual de Referencia de Emacs Lisp), Emacs puede descargar automáticamente la especificación de un paquete desde dicho archivo. Si el primer argumento pasado a package-vc-install
es un símbolo que nombra un paquete, entonces Emacs usará la especificación proporcionada por el archivo para ese paquete.
;; Emacs descargará la especificación de BBDB desde GNU ELPA:
(package-vc-install 'bbdb)
El primer argumento de package-vc-install
también puede ser una especificación de paquete. Esto le permite instalar paquetes fuente desde ubicaciones distintas a los archivos conocidos listados en la opción de usuario package-archives
. Una especificación de paquete es una lista de la forma (nombre . spec
), en la que spec debe ser una lista de propiedades utilizando cualquiera de las claves de la siguiente tabla.
Para definiciones de términos básicos para trabajar con repositorios de código y sistemas de control de versiones, vea 29.1.1.3 Conceptos de Control de Versiones.
:url
Una cadena que proporciona la URL que especifica el repositorio del que obtener el código fuente del paquete.
:branch
Una cadena que proporciona la revisión del código a instalar. No confundir con el número de versión de un paquete.
:lisp-dir
Una cadena que proporciona el nombre relativo al repositorio del directorio a utilizar para cargar las fuentes Lisp, que por defecto es el directorio raíz del repositorio.
:main-file
Cadena que proporciona el archivo principal del proyecto, del que se recopilarán los metadatos del paquete. Si no se proporciona, el valor predeterminado es el nombre del paquete con
.el
añadido.:doc
Una cadena que proporciona el nombre relativo al repositorio del fichero de documentación a partir del cual construir un fichero Info. Puede ser un fichero Texinfo o un fichero Org.
:vc-backend
Un símbolo nombrando el backend VC a usar para descargar una copia del repositorio del paquete (ver 29.1.1.2 Sistemas de Control de Versiones Soportados ). Si se omite, Emacs intentará hacer una suposición basada en la URL proporcionada, o, en su defecto, el proceso volverá al valor de
package-vc-default-backend
.
;; Especificar la información manualmente:
(package-vc-install
'(bbdb :url "https://git.savannah.nongnu.org/git/bbdb.git"
:lisp-dir "lisp"
:doc "doc/bbdb.texi"))