Я добавляю поддержку поддержки пакета, предоставляющего пару глобальных независимых от режима команд. Так как я не хочу, чтобы загрузить пакет, если пользователь явно не вызывает команды через привязки еще я хочу, чтобы настраивать прямо после того как пользователь установит пакет, я пытался использовать код вроде:Настройка и загрузка пакетов Emacs
;;;###autoload
(defcustom foo-bar nil
"bar setting for for"
:type boolean)
;;;###autoload
(defun foo-command-1() ...)
С, что после того как я установите пакет, который я могу вызвать foo-command-1
. Я также могу использовать customize-variable
для установки и сохранения foo-bar
. Однако, когда я снова запускаю Emacs, значение foo-bar
сбрасывается по умолчанию, и Emacs жалуется, что значение изменяется вне настройки.
AFAICS причина в том, что код, который Emacs помещает в файл автозагрузки для defcustom, предполагает, что он будет работать до того, как Emacs вызовет custom-set-variables
в init.el
. Однако это не относится к пакету, который автозагрузка запускается после файла инициализации.
Это известная проблема? Для того, чтобы обойти я заменил выше что-то вроде:
;;;###autoload
(unless (fboundp 'foo-command-1)
(defcustom foo-bar nil
"bar setting for for"
:type boolean))
;;;###autoload
(defun foo-command-1() ...)
Это копирует все определения defcustom в автозагрузки и предотвращает запуск его во второй раз, когда пакет будет загружен по-настоящему. Это работает, и сохраненные параметры правильно восстановлены. Тем не менее я озадачен тем, почему ###autoload
для defcustom
не делает правильную вещь самостоятельно.
Это скорее комментарий, чем ответ. И вы говорите о существовании неназванных проблем, не описывая ни одного из них. Руководство делать или не делать что-то, без объяснения причин, в лучшем случае является комментарием. – Drew
Можете ли вы привести пример неправильного поведения, который можно ожидать с помощью примера кода из вопроса? Я не мог найти его до сих пор с моим ограниченным тестированием. –
@IgorBukanov: В этом конкретном случае одна вещь, которая приходит на ум, заключается в том, что автозагрузка копии кода перемещается за пределы ее контекста, поэтому она не будет наследовать «неявную группу» таким же образом. – Stefan