Emacs 24: загрузка пакета, установленного через ELPA
Я только что установил 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"
4 ответа
Я установил 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... и попробовать переустановить, если приведенный выше код не работает (используя ваш собственный путь).
Учитывая природу вики как половинного хранилища кода, наполовину памятной записки для хакеров Emacs, вы по понятным причинам упустили из виду этот момент:
может быть проще просто переместить инициализацию пакета в другую точку во время запуска, чтобы вы могли (требовать) пакеты ELPA; это решает множество описанных проблем:
Вот что я делаю; один из первых файлов, загруженных моим пользовательским скриптом инициализации (создание которого, из всего, что я могу собрать, - это pons asinorum из серьезного использования Emacs 1)
(require 'package)
(setq package-enable-at-startup nil)
(package-initialize)
и оттуда я просто (require)
какие пакеты ELPA мне нужны. Это также имеет то преимущество, что позволяет лучше контролировать поведение установленных пакетов ELPA; если, например, я хочу отключить данный пакет на данный момент, но не удалить его полностью, достаточно просто закомментировать соответствующий (require)
call, где поведение по умолчанию потребует полного удаления пакета из моего каталога ELPA.
(1. Несмотря на почти подавляющее искушение, я мужественно отказался назвать свой собственный сценарий инициализации lightsaber.el
.)
Вы можете просто выполнить всю свою инициализацию после загрузки пакетов, используя after-init-hook
, Из EmacsWiki:
;; init.el
(add-hook 'after-init-hook (lambda () (load "<real init file>")))
У меня была похожая проблема, когда я начал использовать ELPA. В моем случае у меня было несколько локальных пакетов, так как их не было в ELPA.
И, таким образом, я изменил путь загрузки. По какой-то причине путь загрузки не обновляется надлежащим образом package.el. Для решения проблемы пришлось поставить (setq load-path (cons "~/.emacs.d" load-path))
после звонка package-initialize