ver tengo saber paquetes instalados instalado hat esta comprobar como emacs elisp

emacs - tengo - ver paquetes instalados de php



¿Cómo determinar si un paquete está instalado en elisp? (6)

¿Por qué no usar "featurep"?

(featurep FEATURE &optional SUBFEATURE)

Devuelve t si FEATURE está presente en este Emacs.

(if (featurep ''ecb) (message "ECB is there!"))

Quiero personalizar el entorno mientras el paquete específico está instalado correctamente. ¿Cómo comprobar si algún paquete está instalado en elisp? ¿Algo como esto?:

(if (require ''ecb) (progn (setq ....)) (message "ECB not installed!"))


Cuatro años tarde en esta pregunta, pero ... aquí hay una macro simple que lo hará por usted.

(defmacro when-feature-loaded (feature &rest body) "Executes BODY if and only if FEATURE is loaded." (declare (indent defun)) `(when (featurep ,module) @,body))

Por ejemplo:

(when-feature-loaded ''foo (message "foo is loaded!"))

Aquí hay otra versión con un caso "else", en caso de que también necesite manejar eso.

(defmacro if-feature-loaded (module then-form else-form) "Executes THEN-FORM if and only if MODULE is already loaded, otherwise executes ELSE-FORM." (declare (indent 2)) `(if (featurep ,module) ,then-form ,else-form))


El (require) lanzará un error si falla. Eso debería ser todo lo que necesitas.

Si desea configurar el comportamiento de ECB solo cuando está disponible, busque principalmente agregar cosas a ecb-hook , esta es la forma normal de configurar un paquete de Emacs de manera condicional.

Si no hay un gancho disponible, o si desea girarlo con la mano por alguna razón, intente algo como

(eval-after-load ''ecb ''(setq ecb-be-more-like-better-yes-p t))

Si realmente quieres rodar esto a mano, puedes atrapar el error de una falla como esta:

(condition-case nil (progn (require ''ecb) (setq ecb-be-more-like-better-yes-p t) ) (file-error (message "ECB not available; not configuring") ))

Tenga en cuenta que el condition-case detectará cualquier file-error de file-error desde dentro del progn por lo que debe asegurarse de no realizar ninguna otra operación de archivo dentro. En última instancia, es posible que desee incluir solo el require dentro de un condition-case y utilizarlo como condición para su original if formulario, pero esto ya se está yendo de las manos ...

(if (condition-case nil (require ''ecb) (error nil)) (setq ecb-be-more-like-better-yes-p t) (message "ECB not available; not configuring") )


La respuesta de tripleee es un ejemplo útil de manejo de errores, pero innecesario en este caso.

(when (require ''some-library nil ''noerror) do-things)

Ese ''noerror puede ser cualquier valor no nulo, pero por supuesto es más descriptivo de esta manera. A menudo veo :noerror usa, pero no tengo idea si hay alguna ventaja en particular al usar un argumento de palabra clave sobre un símbolo (comentarios, ¿alguien? Estoy muy interesado en saberlo).

require es una función incorporada en C source code .

(Requerir FEATURE y opcional FILENAME NOERROR)

Si la característica FUNCIÓN no está cargada, cárguela desde FILENAME.
Si FEATURE no es un miembro de las features de la lista, entonces la función
no esta cargado así que cargue el archivo FILENAME.
Si se omite FILENAME, el nombre de impresión de FEATURE se utiliza como nombre de archivo,
y load intentará cargar este nombre junto con el sufijo .elc o
.el , en ese orden. No se utilizará el nombre sin sufijo adjunto.
Vea get-load-suffixes para la lista completa de sufijos.
Si el tercer argumento opcional NOERROR es no nulo,
luego devuelva nil si no se encuentra el archivo en lugar de señalar un error.
Normalmente el valor de retorno es FUNCIÓN.
Se suprimen los mensajes normales al inicio y al final de la carga de FILENAME.


La respuesta más simple es usar require y eval-after-load como se indica en otras respuestas.

Sin embargo, eso no siempre es conveniente, como en una función llamada por un gancho de modo que desea activar otro modo menor, pero solo si el paquete está instalado. En este caso, featurep es relevante.

Los paquetes de Emacs utilizan cada vez más la carga automática para mejorar el tiempo de inicio. Si prueba la presencia de un paquete utilizando require , está usando el costo de cargar el (los) archivo (s). Si utiliza los paquetes ELPA / MELPA / Marmalade (disponibles de forma predeterminada desde la versión 24), es posible que muchos paquetes estén disponibles en un estado aún sin descargar, pero un paquete con autoloads proporcionará una característica foo-autoloads . Escribí una función que es útil para probar si un paquete está disponible en términos de que ya se haya cargado o configurado para cargarse automáticamente.

(defun autofeaturep (feature) "For a feature symbol ''foo, return a result equivalent to: (or (featurep ''foo-autoloads) (featurep ''foo)) Does not support subfeatures." (catch ''result (let ((feature-name (symbol-name feature))) (unless (string-match "-autoloads$" feature-name) (let ((feature-autoloads (intern-soft (concat feature-name "-autoloads")))) (when (and feature-autoloads (featurep feature-autoloads)) (throw ''result t)))) (featurep feature))))


Para las personas que se preguntan cómo verificar si un paquete package.el está instalado, use package-installed-p .