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-mode с помощью 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 ... и попробовать переустановить, если приведенный выше код не работает (используя ваш собственный путь).

lawlist
источник
Конечно, но если я что-то упустил, если позже вы обновите cmake-mode через ELPA, то либо каталог будет переименован в нечто, отсутствующее в вашем файле инициализации, либо более новая версия окажется в каталоге, который не указан в вашем пути загрузки; в последнем случае вы либо не видите обновления, либо получаете излишнюю странность, потому что вы загружаете одну версию вручную и (package-initialize)загружаете другую. Я ошибаюсь? Я имею в виду, что я не очень много использовал ELPA и еще не обновлял пакеты, поэтому могу ошибаться. И, конечно, это не главная проблема в любом случае, но почему бы не избежать ее полностью?
Аарон Миллер
Ты прав. Тем не менее, пакеты не просто обновляются сами, не зная об этом - если и когда вы обновитесь, то это будет время для вашей работы по дому. Я часто трачу значительное количество времени на изменение исходных файлов различных пакетов, и я не обязательно хочу, чтобы они обновлялись, потратив все это время на то, чтобы сделать их правильными. Emacs далек от того, что можно считать «необслуживаемым».
юрист
Отличный момент.
Аарон Миллер
3

Учитывая природу вики как половинного хранилища кода, наполовину памятной записки для хакеров Emacs, вы по понятным причинам упустили из виду этот момент:

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

Это то чем я занимаюсь; один из первых файлов, загруженных моим пользовательским сценарием инициализации (создание которого, из всего, что я могу собрать, - это pons asinorum из серьезного использования Emacs 1 )

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

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

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

Аарон Миллер
источник
Просто напоминание, что нужно проверить каталог user-emacs, если он был изменен, поскольку пакеты ELPA находятся там по умолчанию. Я храню свои вещи в Dropbox, и я был удивлен, не увидев никакого эффекта от вышеперечисленных команд в моем пакетном скрипте, пока не установил его.
мл
1

Вы можете просто выполнить всю свою инициализацию после загрузки пакетов, используя after-init-hook. Из EmacsWiki :

;; init.el
(add-hook 'after-init-hook (lambda () (load "<real init file>")))
Паулсбо
источник
0

У меня была похожая проблема, когда я начал использовать ELPA. В моем случае у меня было несколько локальных пакетов, так как их не было в ELPA.

И, таким образом, я изменил путь загрузки. По какой-то причине путь загрузки не обновляется надлежащим образом package.el. Для решения проблемы пришлось поставить (setq load-path (cons "~/.emacs.d" load-path)) после звонкаpackage-initialize

Дмитро
источник