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.