Emacs 24: caricamento di un pacchetto installato tramite ELPA


12

Ho appena installato il cmake-modepacchetto in Emacs 24 usando:

M-x package-install cmake-mode

Posso vedere il pacchetto su:, ~/.emacs.d/elpa/cmake-mode-20110824e posso caricarlo usando le istruzioni nella Commentary:sezione di ~/.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))

Tuttavia, ciò contraddice le istruzioni per l' uso sulla pagina EmacsWiki di ELPA:

... i pacchetti vengono inizializzati DOPO il caricamento di init.el. Questo significa che NON dovresti inserire l'inizializzazione specifica del pacchetto nel tuo init.el ...

Tendo a concordare con queste istruzioni perché aggiungendo al mio ~/.gnu-emacsfile una riga come:

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

è brutto e si romperà se e quando aggiornerò il pacchetto. Tuttavia, senza questa riga non sono in grado di utilizzare cmake-mode.

Mi sto perdendo qualcosa qui?

Appunti:

  • Non ho fatto nulla di strano package-enable-at-startupe il suo 'valore è t.
  • Sto usando il preludio .
  • user-emacs-directoryil valore è "~/.emacs.d/" (Grazie @lawlist per il suggerimento)
  • package-user-dir il valore è "~/.emacs.d/elpa"

1
È possibile che tu abbia modificato le posizioni di default-directoryo il user-emacs-directory, in modo tale che la elpadirectory non venga caricata? package-installcrea una elpadirectory e il file di caricamento automatico che viene creato durante l'installazione si basa su quella posizione.
elenco delle leggi

1
L'ultima riga di codice nella tua domanda suggerisce che hai spostato il pacchetto fuori dalla elpadirectory - cioè, ~/.emacs.d/cmake-mode-20110824/non è dove il file di caricamento automatico si aspetta che sia.
elenco delle leggi

@lawlist: sei molto attento. Ho fatto un errore nella domanda. Ora è risolto (la domanda) sul valore corretto di ~/.emacs.d/elpa/cmake-mode-20110824/. Il problema rimane.
Chen Levy,

Risposte:


2

Ho installato cmake-mode con marmalade-repo e ho dato un'occhiata a cmake-mode-autoloads.el. Sembra che l'autore abbia preso una decisione consapevole notincludendo tutto il necessario per l'installazione all'interno del file di caricamento automatico. Tuttavia, le istruzioni alle righe da 25 a 30 di cmake-mode.el sono corrette, che hai citato nella tua domanda. Se si utilizzano le righe da 25 a 30 e si imposta correttamente il percorso, NON è necessaria una riga di codice aggiuntiva come (add-to-list 'load-path "~/.emacs.d/elpa/cmake-mode-20110824/").

Ovviamente, non vorresti usare /dir/with/cmake-mode- vuoi usare ~/.emacs.d/elpa/cmake-mode-20110824senza una spinta in avanti alla fine.

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

Potrebbe essere necessario eliminare la directory c-make-mode ... e provare a reinstallare se il codice sopra non funziona (usando il tuo percorso).


Certo, ma a meno che non mi manchi qualcosa, se successivamente aggiorni la modalità cmake tramite ELPA, allora la directory viene rinominata in qualcosa che non è nel tuo file init, o la versione più recente finisce in una directory che non è nel tuo percorso di caricamento; in quest'ultimo caso, o non vedi l'aggiornamento, o ottieni stranezze inconsuete perché stai caricando manualmente una versione e ne stai (package-initialize)caricando un'altra. Ho sbagliato? Voglio dire, non ho usato molto ELPA e devo ancora aggiornare i pacchetti con esso, quindi potrei sbagliarmi. E, sicuramente, non è una preoccupazione importante in ogni caso, ma perché non evitarlo del tutto?
Aaron Miller,

Hai ragione. Tuttavia, i pacchetti non si aggiornano da soli senza che tu ne sia a conoscenza - se e quando esegui l'aggiornamento, quello sarebbe il momento di fare le pulizie. Spesso investo una notevole quantità di tempo a modificare i file sorgente di vari pacchetti e non li vorrei necessariamente aggiornare dopo aver trascorso tutto quel tempo a ottenerli nel modo giusto. Emacs è ben lungi dall'essere considerato "esente da manutenzione".
elenco delle leggi del

Un punto eccellente.
Aaron Miller,

3

Data la natura del wiki come repository di mezzo codice, mezzo promemoria per gli hacker Emacs, hai comprensibilmente trascurato questo punto:

potrebbe essere più semplice spostare l'inizializzazione del pacchetto in un altro punto durante l'avvio in modo da poter (richiedere) pacchetti ELPA; questo risolve molti dei problemi descritti:

Questo è ciò che faccio; uno dei primi file caricati dal mio script init personalizzato (la cui creazione, da tutto ciò che posso raccogliere, è il pons asinorum del serio utilizzo di Emacs 1 )

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

e da lì ho semplicemente (require)quali pacchetti ELPA mi servono. Ciò ha anche il vantaggio di consentire un controllo più preciso sul comportamento dei pacchetti installati da ELPA; se, per esempio, desidero disabilitare un determinato pacchetto per il momento ma non disinstallarlo del tutto, si tratta semplicemente di commentare la (require)chiamata pertinente , in cui il comportamento predefinito richiederebbe lo spostamento del pacchetto dalla mia directory ELPA.

(1. Nonostante la tentazione quasi schiacciante, mi sono rifiutato di nominare il mio script init personalizzato lightsaber.el.)


Solo un promemoria per verificare su user-emacs-directory se modificato poiché i pacchetti ELPA risiedono lì per impostazione predefinita. Tengo le mie cose in Dropbox e sono stato sorpreso di non vedere alcun effetto dai comandi sopra nel mio script batch fino a quando non l'ho impostato.
mlt

1

È possibile eseguire tutte le inizializzazioni dopo aver caricato i pacchetti after-init-hook. Da EmacsWiki :

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

0

Ho avuto un problema simile quando ho iniziato a usare ELPA. Nel mio caso ho avuto diversi pacchetti locali in quanto non erano presenti in ELPA.

E così avevo modificato il percorso di carico. Per qualche motivo il percorso di caricamento non è aggiornato correttamente da package.el. Per risolvere il problema che ho dovuto porre (setq load-path (cons "~/.emacs.d" load-path)) dopo la chiamata apackage-initialize

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.