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

4381
Chen Levy

Я только что установил 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"
12
Возможно ли, что вы изменили расположение `default-directory` или` user-emacs-directory` так, что каталог `elpa` не загружается? `package-install` создает каталог` elpa`, и файл автозагрузки, который создается во время установки, основан на этом расположении. lawlist 10 лет назад 1
Ваша последняя строка кода в вашем вопросе говорит о том, что вы переместили пакет из каталога `elpa` - т.е.` ~ / .emacs.d / cmake-mode-20110824 / `не там, где файл автозагрузки ожидает, что он будет , lawlist 10 лет назад 1
@lawlist: Вы очень наблюдательны. Я сделал ошибку в вопросе. Теперь он исправлен (вопрос) к правильному значению `~ / .emacs.d / elpa / cmake-mode-20110824 /`. Проблема остается. Chen Levy 10 лет назад 0

4 ответа на вопрос

3
Aaron Miller

Учитывая природу вики как половинного хранилища кода, наполовину памятной записки для хакеров 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-directory *, если оно было изменено, поскольку пакеты ELPA находятся там по умолчанию. Я храню свои вещи в Dropbox, и я был удивлен, не увидев никакого эффекта от вышеупомянутых команд в моем пакетном скрипте, пока я не установил их. mlt 9 лет назад 0
2
lawlist

I installed cmake-mode with the marmalade-repo, and took a look at cmake-mode-autoloads.el. It appears that the author made a conscious decision not include everything needed for the setup within the autoloads file. However, the instructions on lines 25 to 30 of cmake-mode.el are correct, which you cited in your question. If you use lines 25 to 30 and set the path correctly, then you do NOT need an extra line of code such as (add-to-list 'load-path "~/.emacs.d/elpa/cmake-mode-20110824/").

Obviously, you would not want to use /dir/with/cmake-mode -- you want to use ~/.emacs.d/elpa/cmake-mode-20110824 without a forwardslash at the ending.

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

You may need to delete the c-make-mode... directory and try reinstalling if the code above does not work (using your own path).

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

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

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

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

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