2015-09-21 4 views
3

Я добавляю поддержку поддержки пакета, предоставляющего пару глобальных независимых от режима команд. Так как я не хочу, чтобы загрузить пакет, если пользователь явно не вызывает команды через привязки еще я хочу, чтобы настраивать прямо после того как пользователь установит пакет, я пытался использовать код вроде:Настройка и загрузка пакетов 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 не делает правильную вещь самостоятельно.

ответ

1

Как правило, вы не хотите автоматически загружать переменные.

Да, это известная проблема, и нет на самом деле хорошего решения (каждое решение, которое я мог придумать, имел свой набор ошибок/ошибок), поэтому все, что я могу сказать, это «не загружать автозагрузку» переменные, пожалуйста ».

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

+0

Это скорее комментарий, чем ответ. И вы говорите о существовании неназванных проблем, не описывая ни одного из них. Руководство делать или не делать что-то, без объяснения причин, в лучшем случае является комментарием. – Drew

+0

Можете ли вы привести пример неправильного поведения, который можно ожидать с помощью примера кода из вопроса? Я не мог найти его до сих пор с моим ограниченным тестированием. –

+0

@IgorBukanov: В этом конкретном случае одна вещь, которая приходит на ум, заключается в том, что автозагрузка копии кода перемещается за пределы ее контекста, поэтому она не будет наследовать «неявную группу» таким же образом. – Stefan

2

Да, то, что вы сделали, является разумным способом выполнить то, что вы хотите. Если вы хотите автозагрузить defcustom, и вам будет интересно, когда он будет оцениваться по отношению к другому коду, вам необходимо каким-то образом контролировать это время. Способ, который вы выбрали, является разумным.

Файл инициализации пользователя может загружать custom-file в любой момент, который пользователь выбирает. И если не используется custom-file, то до сих пор неясно, в какой момент часть кода инициализационного файла, который управляется настройкой, будет оцениваться по отношению к другим частям, которые могут зависеть от значений, которые он устанавливает.