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"

4 ответа4

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .