Как использовать автозагрузку для правильной загрузки пользовательской конфигурации? - PullRequest
5 голосов
/ 28 мая 2011

Я использую следующую структуру в моей конфигурации emacs: Для каждого режима программирования, который я использую, я сохраняю конфигурацию в файле, называемом program-mode-config.el.(Таким образом, конфигурация python будет идти в python-mode-config.el и т. Д.).

Раньше я требовал каждый из этих файлов в моем init.el.Недостатком этого подхода было то, что мое время запуска было огромным.Поэтому в эти выходные я сел и перевел все требования в автозагрузку.Теперь мой файл инициализации выглядит так:

(autoload 'python-mode "python-mode-config" "Load python config" t)

Таким образом, конфигурация python не будет загружена, пока я не открою файл python.Это помогло мне сократить время запуска примерно до 1 секунды, но оно не работает должным образом во всех случаях.Например,

(autoload 'erc "erc-mode-config" "Load configuration for ERC" t)

не загружает мои настройки erc вообще.Глядя на документацию по автозагрузке, он заявляет, что:

Define FUNCTION to autoload from FILE.
...
If FUNCTION is already defined other than as an autoload,
this does nothing and returns nil.

Итак, я предполагаю, что конфигурация erc не загружена, потому что ERC встроен в emacs, тогда как python-mode - это плагин, который я использую,Можно ли как-нибудь загрузить конфигурацию erc, только когда я действительно использую erc?Единственная альтернатива, которую я вижу, - это использование eval-after-load, но было бы довольно болезненно поместить каждый маленький кусочек моей настройки в eval-after-load.

Боюсь, что это также может бытьчто я не запустил автозагрузки должным образом.Любая помощь будет оценена.

1 Ответ

10 голосов
/ 28 мая 2011

autoload предназначен для загрузки функций из определенного файла, а не для загрузки дополнительных функциональных возможностей - именно так вы и пытаетесь делать.

Используйте eval-after-load вместо:

(eval-after-load "erc" '(load "erc-mode-config"))

Это говорит Emacs загружать библиотеку erc-mode-config после загрузки файла "erc" - это то, что вам нужно. Вы также можете использовать '(require 'erc-mode-config), если внутри него есть оператор provide.

Правильное использование autoload - загрузка фактического файла, содержащего символ. Итак, имея

(autoload 'erc "erc-mode-config" "Load configuration for ERC" t)

Вы говорили Emacs найти функцию erc, загрузив библиотеку "erc-mode-config", в которой не определена функция erc. Кроме того, строка документа предназначена для рассматриваемой функции, поэтому приведенный выше оператор autoload делает строку справки для erc равной "Load configuration for ERC" - что также неверно.

Полагаю, ваш первый autoload пример работает, потому что в вашем конфигурационном файле есть оператор (require 'python) ... но это всего лишь предположение.

...