Emacs 24: Завантаження пакета, встановленого через ELPA


12

Я щойно встановив cmake-modeпакет в Emacs 24, використовуючи:

M-x package-install cmake-mode

Я бачу пакунок за адресою: ~/.emacs.d/elpa/cmake-mode-20110824і можу завантажити його, використовуючи інструкцію в Commentary:розділі ~/.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))

Однак це суперечить інструкції з використання на сторінці EmacsWiki ELPA:

... пакети ініціалізуються ПІСЛЯ завантаження init.el. Це означає, що НЕ слід ставити ініціалізацію для пакета у свій init.el ...

Я схильний погоджуватися з цією інструкцією, оскільки додаю до мого ~/.gnu-emacsфайлу такий рядок, як:

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

некрасиво, і зламається, якщо і коли я буду оновити пакет. Однак без цього рядка я не можу користуватися cmake-mode.

Я чогось тут пропускаю?

Примітки:

  • Я нічого дивного не зробив, package-enable-at-startupі його значення є t.
  • Я використовую прелюдію .
  • user-emacs-directoryЗначення "~/.emacs.d/" (спасибі @lawlist за пропозицію)
  • package-user-dir значення є "~/.emacs.d/elpa"

1
Можливо, ви змінили розташування default-directoryабо user-emacs-directory, так, що elpaкаталог не завантажується? package-installстворює elpaкаталог, і файл автозавантаження, який створюється під час встановлення, базується на цьому місці.
законник

1
Ваш останній рядок коду у вашому запитанні говорить про те, що ви перемістили пакунок із elpaкаталогу - тобто, ~/.emacs.d/cmake-mode-20110824/не там, де файл автозавантаження очікує його.
законник

@lawlist: Ви дуже спостережливі. Я помилився у питанні. Тепер вона зафіксована (питання) до правильного значення ~/.emacs.d/elpa/cmake-mode-20110824/. Проблема залишається.
Чен Леві

Відповіді:


2

Я встановив режим cmake разом з marmalade-repo і подивився на cmake-mode-autoloads.el. Схоже, автор прийняв свідоме рішення, notвключаючи все необхідне для налаштування у файлі автозавантажень. Однак вказівки на рядках від 25 до 30 програми cmake-mode.el є правильними, які ви цитували у своєму запитанні. Якщо ви використовуєте рядки 25-30 і правильно встановите шлях, то НЕ потрібен додатковий рядок коду, наприклад (add-to-list 'load-path "~/.emacs.d/elpa/cmake-mode-20110824/").

Очевидно, ви б не хотіли користуватися /dir/with/cmake-mode- ви хочете використовувати ~/.emacs.d/elpa/cmake-mode-20110824без форваршу в кінці.

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

Можливо, вам доведеться видалити каталог c-make-mode ... і спробувати перевстановити, якщо код вище не працює (використовуючи власний шлях).


Звичайно, але якщо я чогось не пропускаю, якщо ви згодом оновите cmake-режим через ELPA, то або каталог буде перейменований на щось, що не є у вашому файлі init, або новіша версія опиниться в каталозі, який не знаходиться у вашому шляху завантаження; в останньому випадку ви або не бачите оновлення, або ви отримуєте надмірну дивність, оскільки ви завантажуєте одну версію вручну та (package-initialize)завантажуєте іншу. Я помиляюся? Я маю на увазі, що я мало використовував ELPA і ще не оновлював будь-які пакунки з ним, тому можу помилитися. І, звичайно, це не є головним питанням у будь-якому випадку, але чому б не уникнути цього повністю?
Аарон Міллер

Ви праві. Однак пакети не просто оновлюються, не знаючи про це - якщо і коли ви оновлюєтесь, то саме час би вести домашнє господарство. Я часто вкладаю значну кількість часу, змінюючи вихідні файли різних пакетів, і я не обов'язково хотів би, щоб вони оновлювалися після того, як витратили весь цей час на отримання їх як раз. Emacs далеко не те, що можна вважати "безкоштовним обслуговуванням".
законник

Відмінний момент.
Аарон Міллер

3

Враховуючи природу вікі як сховище з половинним кодом, наполовину пам’ятником для хакерів Emacs, ви, зрозуміло, не помітили цього моменту:

може бути простіше просто перемістити ініціалізацію пакета до іншої точки під час запуску, щоб ви могли (вимагати) пакети ELPA; це стосується багатьох описаних питань:

Це я і роблю; один з перших файлів, завантажених моїм користувальницьким сценарієм init (створення якого, з усього, що я можу зібрати, - це pons asinorum для серйозного використання Emacs 1 )

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

і звідти я просто (require)які пакети ELPA мені потрібні. Це також має перевагу, що дозволяє точніше контролювати поведінку пакунків, встановлених ELPA; якщо, наприклад, я хочу на даний момент відключити певний пакет, але не видалити його цілком, це просте питання прокоментувати відповідний (require)виклик, де поведінка за замовчуванням вимагає цілковитого переміщення пакета з мого каталогу ELPA.

(1. Незважаючи на майже переважну спокусу, я по-людськи відмовився назвати свій власний сценарій init lightsaber.el.)


Просто нагадування про те, щоб перевірити користувач-emacs-каталог, якщо його змінили, оскільки пакети ELPA замовчуються. Я зберігаю свої речі в Dropbox, і я був здивований, не побачивши жодного ефекту від вищезазначених команд у своєму пакетному скрипті, поки не встановив його.
mlt

1

Ви можете просто виконати всю ініціалізацію після завантаження пакунків after-init-hook. Від EmacsWiki :

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

0

У мене були подібні проблеми, коли я почав використовувати ELPA. У моєму випадку у мене було кілька локальних пакетів, оскільки таких не було в ELPA.

І таким чином я змінив шлях навантаження. З пакету пакет.el чомусь неправильно оновлено шлях завантаження. Щоб вирішити проблему, мені довелося поставитись (setq load-path (cons "~/.emacs.d" load-path)) після дзвінкаpackage-initialize

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.