2012-06-20 14 views
43

Me parece que el nuevo sistema de paquete que está incorporado en Emacs 24 tiene algunos defectos a la hora de cargar e inicializar correctamente los paquetes instalados.Emacs 24 Problemas de inicialización del sistema de paquete

Recientemente, actualicé a Emacs 24.1.1 que se publicó el 10/06/2012 y he estado tratando de usar el sistema de paquete integrado y he instalado varios paquetes que lo usan, pero todos tienen un problema similar relacionado con la autocarga y la inicialización. Por ejemplo, utilizo un paquete llamado smex que proporciona mejoras para usar el acorde M-x. Requiere que defina una clave para M-x, así que agregué (global-set-key (kbd "M-x") 'smex) en mi archivo init.el. Pero después de comenzar emacs que presione el acorde M-x y me sale el mensaje "definición de la función del símbolo es nula: PyMEx" ... Si yo quiero tambien ponerla en mi archivo (require 'smex) init.el me sale el mensaje de error "Error de archivo: No se puede archivo de carga abierta, PyMEx"

Adición de la ubicación de PyMEx a la variable load-path hace que funcione como se espera, sin embargo, que parece derrotar todo el propósito de tener un sistema de paquetes en el primer lugar ...

¿Alguna idea? ¿Hay una manera mejor o vivimos con esta limitación por ahora?

Respuesta

38

Los paquetes que instale con package.el se activan por defecto después de su.emacs se carga. Para poder usarlos antes del final de su .emacs que necesita para activarlos mediante el uso de los comandos:

(setq package-enable-at-startup nil) 
(package-initialize) 
+0

Creo que la respuesta por phils es mucho más valiosa e incluso correcta de éste; él también explica por qué. –

+4

@ErikAllik, downvoting es informar que la información es inexacta. Solo debería haber votado la otra respuesta más precisa. Para entender por qué se aceptó esta respuesta, solo mira las fechas. Fue escrito 15 meses antes que el otro. –

+1

Fue solo para equilibrar un poco las puntuaciones, un acto posiblemente inapropiado :) –

74

Vale la pena señalar qué Emacs aplaza el paquete de inicialización:

Ver Chig(emacs) Package InstallationRET, y en particular:

The reason automatic package loading occurs after loading the init file is that user options only receive their customized values after loading the init file, including user options which affect the packaging system. In some circumstances, you may want to load packages explicitly in your init file (usually because some other code in your init file depends on a package). In that case, your init file should call the function package-initialize . It is up to you to ensure that relevant user options, such as package-load-list (see below), are set up prior to the package-initialize call. You should also set package-enable-at-startup to nil , to avoid loading the packages again after processing the init file. Alternatively, you may choose to completely inhibit package loading at startup, and invoke the command M-x package-initialize to load your packages manually.

Así que siempre que se asegure de que su archivo de inicio se hace cargo de todos los valores no predeterminados que desea para las variables en el grupo package personalización antes de llamar package-initialize - y que mantenga este enfoque cada vez que la personalización de la biblioteca de paquete config - debería estar bien hacer esto.

Alternativamente, porque after-init-hook se ejecuta después de que se haya completado la inicialización del paquete estándar, puede usarlo para evaluar cualquier código de inicio que dependa de los paquetes. Así que en lugar de llamar directamente en package-initialize init.el, en su lugar podría escribir:

(add-hook 'after-init-hook 'my-after-init-hook) 
(defun my-after-init-hook() 
    ;; do things after package initialization 
) 

poner el código que requiere el sistema de paquetes inicializado dentro de esa función.

YMMV.

(nb) No he probado el enfoque after-init, ya que realmente no utilizo package.el, pero confirmé la secuencia de eventos en el código de inicio, así que creo que funcionará como descrito.)

M-xcustomize-groupRET RETpackage

+4

No tengo idea de por qué esta respuesta ha recibido tan pocos votos y no ha sido aceptada ... A la luz de lo que ha explicado, el La solución ofrecida en la respuesta aceptada incluso comienza a parecer un truco. –

+1

Mejor explicación. He aprendido mucho de esta publicación. – mlwn

+0

¡Gran respuesta! ¿Debo seguir necesitando mis paquetes después de cargarlos con la inicialización del paquete? – Veritas

Cuestiones relacionadas