Emacs 24: carga de un paquete instalado a través de ELPA

12

Acabo de instalar el cmake-modepaquete en Emacs 24 usando:

M-x package-install cmake-mode

Puedo ver el paquete en:, ~/.emacs.d/elpa/cmake-mode-20110824y puedo cargarlo usando las instrucciones en la Commentary:sección de ~/.emacs.d/elpa/cmake-mode-20110824/cmake-mode.el:

;; Add this code to your .emacs file to use the mode:
;;
;;  (setq load-path (cons (expand-file-name "/dir/with/cmake-mode") load-path))
;;  (require 'cmake-mode)
;;  (setq auto-mode-alist
;;        (append '(("CMakeLists\\.txt\\'" . cmake-mode)
;;                  ("\\.cmake\\'" . cmake-mode))
;;                auto-mode-alist))

Sin embargo, esto contradice las instrucciones de uso en la página EmacsWiki de ELPA:

... los paquetes se inicializan DESPUÉS de cargar init.el. Esto significa que NO debe poner la inicialización específica del paquete en su init.el ...

Tiendo a estar de acuerdo con esta instrucción porque agrego a mi ~/.gnu-emacsarchivo una línea como:

(add-to-list 'load-path "~/.emacs.d/elpa/cmake-mode-20110824/")

es feo y se romperá si actualizo el paquete y cuándo lo haré. Sin embargo, sin esta línea no puedo usar cmake-mode.

¿Me estoy perdiendo de algo?

Notas:

  • No hice nada extraño package-enable-at-startupy su 'valor es t.
  • Estoy usando preludio .
  • user-emacs-directoryvalor es "~/.emacs.d/" (Gracias @lawlist por la sugerencia)
  • package-user-dir el valor es "~/.emacs.d/elpa"
Chen Levy
fuente
1
¿Es posible que haya alterado las ubicaciones de default-directoryo el user-emacs-directory, de modo que el elpadirectorio no se esté cargando? package-installcrea un elpadirectorio y el archivo de autocarga que se crea durante la instalación se basa en esa ubicación.
abogados el
1
Su última línea de código en su pregunta sugiere que movió el paquete fuera del elpadirectorio, ~/.emacs.d/cmake-mode-20110824/es decir, no está donde el archivo de carga automática espera que esté.
abogados el
@lawlist: Eres muy observador. Cometí un error en la pregunta. Ahora está fijado (la pregunta) al valor correcto de ~/.emacs.d/elpa/cmake-mode-20110824/. El problema persiste.
Chen Levy

Respuestas:

2

Instalé cmake-mode con marmalade-repo y eché un vistazo a cmake-mode-autoloads.el. Parece que el autor tomó una decisión consciente de notincluir todo lo necesario para la configuración dentro del archivo de autocarga. Sin embargo, las instrucciones en las líneas 25 a 30 de cmake-mode.el son correctas, que citó en su pregunta. Si usa las líneas 25 a 30 y establece la ruta correctamente, NO necesita una línea de código adicional como (add-to-list 'load-path "~/.emacs.d/elpa/cmake-mode-20110824/").

Obviamente, no querrá usar /dir/with/cmake-mode, quiere usar ~/.emacs.d/elpa/cmake-mode-20110824sin una barra diagonal al final.

(setq load-path (cons (expand-file-name "~/.emacs.d/elpa/cmake-mode-20110824") load-path))
(require 'cmake-mode)
(setq auto-mode-alist
      (append '(("CMakeLists\\.txt\\'" . cmake-mode)
                ("\\.cmake\\'" . cmake-mode))
              auto-mode-alist))

Es posible que deba eliminar el directorio c-make-mode ... e intente reinstalar si el código anterior no funciona (utilizando su propia ruta).

lista de leyes
fuente
Claro, pero a menos que me falte algo, si luego actualiza cmake-mode a través de ELPA, entonces el directorio cambia de nombre a algo que no está en su archivo de inicio, o la versión más nueva termina en un directorio que no está en su ruta de carga; en el último caso, o no ve la actualización, o obtiene una rareza indebida porque está cargando manualmente una versión y (package-initialize)está cargando otra. ¿Me equivoco? Quiero decir, no he usado mucho ELPA y aún no he actualizado ningún paquete con él, así que podría estar equivocado. Y, claro, no es una preocupación importante en ningún caso, pero ¿por qué no evitarlo por completo?
Aaron Miller
Estás en lo correcto. Sin embargo, los paquetes no solo se actualizan por sí mismos sin que usted lo sepa: si se actualiza, entonces ese sería el momento de hacer su limpieza. Con frecuencia invierto una cantidad considerable de tiempo modificando los archivos de origen de varios paquetes, y no necesariamente quiero que se actualicen después de haber pasado todo ese tiempo haciéndolos bien. Emacs está lejos de lo que uno podría considerar "libre de mantenimiento".
leyes
Un excelente punto.
Aaron Miller
3

Dada la naturaleza de la wiki como medio repositorio de código, medio recordatorio de ayuda para los hackers de Emacs, comprensiblemente pasó por alto este punto:

podría ser más fácil mover el paquete inicializado a otro punto durante el inicio para que pueda (requerir) paquetes ELPA; Esto se ocupa de muchos de los problemas descritos:

Esto es lo que hago; uno de los primeros archivos cargados por mi script de inicio personalizado (cuya creación, por lo que puedo deducir, es el pons asinorum del uso serio de Emacs 1 )

(require 'package)
(setq package-enable-at-startup nil)
(package-initialize)

y a partir de ahí, simplemente, (require)qué paquetes ELPA necesito. Esto también tiene la ventaja de permitir un control más preciso sobre el comportamiento de los paquetes instalados por ELPA; si, por ejemplo, quiero deshabilitar un paquete dado por el momento pero no desinstalarlo por completo, es una simple cuestión de comentar la (require)llamada relevante , donde el comportamiento predeterminado requeriría mover el paquete fuera de mi directorio ELPA por completo.

(1. A pesar de la tentación casi abrumadora, me negué virilmente a nombrar mi script de inicio personalizado lightsaber.el).

Aaron Miller
fuente
Solo un recordatorio para verificar el directorio de usuario-emacs si se cambia ya que los paquetes ELPA residen allí de forma predeterminada. Mantengo mis cosas en Dropbox y me sorprendió no ver ningún efecto de los comandos anteriores en mi script por lotes hasta que lo configuré.
mlt
1

Simplemente puede hacer toda su inicialización después de cargar los paquetes usando after-init-hook. De EmacsWiki :

;; init.el
(add-hook 'after-init-hook (lambda () (load "<real init file>")))
Poulsbo
fuente
0

Tuve un problema similar cuando comencé a usar ELPA. En mi caso, he tenido varios paquetes locales, ya que no estaban presentes en ELPA.

Y así había alterado la ruta de carga. Por alguna razón, package.el no actualiza correctamente la ruta de carga. Para resolver el problema tuve que poner (setq load-path (cons "~/.emacs.d" load-path)) después de la llamada apackage-initialize

Dmytro
fuente