Emacs 24: Ładowanie pakietu zainstalowanego za pomocą ELPA

12

Właśnie zainstalowałem cmake-modepakiet w Emacs 24 przy użyciu:

M-x package-install cmake-mode

Widzę paczkę na: ~/.emacs.d/elpa/cmake-mode-20110824i mogę ją załadować, korzystając z instrukcji w Commentary:sekcji ~/.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))

Jest to jednak sprzeczne z instrukcją użytkowania na stronie EmacsWiki ELPA:

... pakiety są inicjowane PO załadowaniu pliku init.el. Oznacza to, że NIE należy umieszczać inicjalizacji specyficznej dla pakietu w pliku init.el ...

Zwykle zgadzam się z tą instrukcją, ponieważ dodając do mojego ~/.gnu-emacspliku wiersz taki jak:

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

jest brzydka i pęknie, jeśli i kiedy zaktualizuję pakiet. Jednak bez tej linii nie mogę użyć cmake-mode.

Czy coś mi umyka?

Uwagi:

  • Nie zrobiłem nic dziwnego, package-enable-at-startupa jego wartość to t.
  • Używam preludium .
  • user-emacs-directorywartość to "~/.emacs.d/" (Dzięki @lawlist za sugestię)
  • package-user-dir wartosc jest "~/.emacs.d/elpa"
Chen Levy
źródło
1
Czy to możliwe, że zmieniłeś lokalizację default-directorylub user-emacs-directory, tak że elpakatalog nie jest ładowany? package-installtworzy elpakatalog, a plik autoloads, który jest tworzony podczas instalacji, jest oparty na tej lokalizacji.
prawnik
1
Ostatni wiersz kodu w pytaniu sugeruje, że wyprowadziłeś pakiet z elpakatalogu - tzn. ~/.emacs.d/cmake-mode-20110824/Nie jest tam, gdzie spodziewa się tego plik autoloads.
prawnik
@lawlist: Jesteś bardzo spostrzegawczy. Popełniłem błąd w pytaniu. Teraz jest ustalone (pytanie) na prawidłową wartość ~/.emacs.d/elpa/cmake-mode-20110824/. Problem pozostaje.
Chen Levy,

Odpowiedzi:

2

Zainstalowałem cmake-mode z marmoladą-repo i spojrzałem na cmake-mode-autoloads.el. Wygląda na to, że autor podjął świadomą decyzję, notwłączając wszystko, co potrzebne do instalacji w pliku autoloads. Jednak instrukcje w wierszach od 25 do 30 polecenia cmake-mode.el są poprawne, które zacytowałeś w swoim pytaniu. Jeśli użyjesz linii od 25 do 30 i poprawnie ustawisz ścieżkę, NIE będziesz potrzebował dodatkowej linii kodu, takiej jak (add-to-list 'load-path "~/.emacs.d/elpa/cmake-mode-20110824/").

Oczywiście nie chciałbyś używać /dir/with/cmake-mode- chcesz używać ~/.emacs.d/elpa/cmake-mode-20110824bez ukośnika na końcu.

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

Może być konieczne usunięcie katalogu c-make-mode ... i próba ponownej instalacji, jeśli powyższy kod nie działa (przy użyciu własnej ścieżki).

lista prawnicza
źródło
Jasne, ale jeśli czegoś mi nie brakuje, jeśli później zaktualizujesz tryb cmake za pomocą ELPA, wówczas albo nazwa katalogu zostanie zmieniona na coś, co nie znajduje się w pliku init, lub nowsza wersja trafi do katalogu, który nie znajduje się w ścieżce ładowania; w tym drugim przypadku albo nie widzisz aktualizacji, albo stajesz się nadmiernie dziwny, ponieważ ręcznie ładujesz jedną wersję, a (package-initialize)ładujesz inną. Czy się mylę? Mam na myśli, że nie korzystałem dużo z ELPA i nie zaktualizowałem jeszcze żadnych pakietów, więc mogę się mylić. I oczywiście nie jest to poważny problem, ale dlaczego by tego nie uniknąć?
Aaron Miller,
Masz rację. Jednak pakiety nie aktualizują się same bez Twojej wiedzy o tym - jeśli i kiedy zaktualizujesz, to będzie czas na wykonanie prac domowych. Często poświęcam znaczną ilość czasu na modyfikowanie plików źródłowych różnych pakietów i niekoniecznie chcę ich aktualizować po tym, jak spędzę tyle czasu na ich poprawnym wykonaniu. Emacs jest daleki od tego, co można by uznać za „bezobsługowe”.
prawnik
Doskonały punkt.
Aaron Miller,
3

Biorąc pod uwagę naturę wiki jako repozytorium pół kodu, pół wspomnienia dla hakerów Emacsa, zrozumiałe jest, że przeoczyłeś ten punkt:

może być łatwiej po prostu przenieść inicjalizację pakietu do innego punktu podczas uruchamiania, aby móc (wymagać) pakietów ELPA; rozwiązuje to wiele opisanych problemów:

Tym się właśnie zajmuję; jednym z pierwszych plików załadowanych przez mój niestandardowy skrypt inicjujący (którego tworzenie, z tego, co mogę zebrać, jest pons asinorum poważnego użycia Emacsa 1 ), robi

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

i stamtąd po prostu (require)potrzebuję pakietów ELPA. Ma to również tę zaletę, że pozwala lepiej kontrolować zachowanie pakietów zainstalowanych w ELPA; jeśli na przykład chcę na chwilę wyłączyć dany pakiet, ale nie odinstalować go całkowicie, wystarczy skomentować odpowiednie (require)wywołanie, gdzie domyślne zachowanie wymagałoby całkowitego przeniesienia pakietu z mojego katalogu ELPA.

(1. Pomimo niemal przytłaczającej pokusy, mężnie odmówiłem nazwania mojego niestandardowego skryptu inicjującego lightsaber.el.)

Aaron Miller
źródło
Przypomnienie, aby sprawdzić katalog user-emacs, jeśli został zmieniony, ponieważ pakiety ELPA znajdują się tam domyślnie. Trzymam swoje rzeczy w Dropbox i byłem zaskoczony, że nie widziałem żadnego efektu z powyższych poleceń w skrypcie wsadowym, dopóki nie ustawiłem go.
mlt
1

Możesz wykonać całą inicjalizację po załadowaniu pakietów za pomocą after-init-hook. Z EmacsWiki :

;; init.el
(add-hook 'after-init-hook (lambda () (load "<real init file>")))
Poulsbo
źródło
0

Miałem podobny problem, kiedy zacząłem używać ELPA. W moim przypadku miałem kilka lokalnych pakietów, ponieważ nie były one obecne w ELPA.

I tak zmieniłem ścieżkę obciążenia. Z jakiegoś powodu ścieżka ładowania nie jest poprawnie aktualizowana przez package.el. Aby rozwiązać ten problem musiałem umieścić (setq load-path (cons "~/.emacs.d" load-path)) po wywołaniupackage-initialize

Dmytro
źródło