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"

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).


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).


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>")))

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.