emacs23 / elisp: как правильно загрузить эту библиотеку?
Я обновляюсь до emacs23. Я обнаружил, что мой emacs.el загружается гораздо медленнее.
Это действительно моя вина... У меня там много всего.
Поэтому я также пытаюсь выполнить автозагрузку всего, что в данный момент "требуется" для моего emacs.el.
У меня есть модуль, который выставляет 12 точек входа - интерактивные функции, которые я могу вызвать.
Является ли правильный подход, чтобы иметь 12 звонков autoload
чтобы гарантировать, что модуль загружен независимо от того, какую функцию я вызываю? Есть ли проблемы с этим подходом? Это создаст проблемы с производительностью?
Если не такой подход, то что?
3 ответа
Что вы действительно хотите, так это чтобы автоматически генерировались автозагрузки, чтобы ваш файл.emacs оставался нетронутым. Большинство пакетов имеют ;;;###autoload
Строки в них уже есть, а если нет, вы можете легко их добавить.
Чтобы управлять этим, вы можете поместить все пакеты в каталог, скажем ~/emacs/lisp
и там есть файл с именем update-auto-loads.el
который содержит:
;; put this path into the load-path automatically
;;;###autoload
(progn
(setq load-path (cons (file-name-directory load-file-name) load-path)))
;;;###autoload
(defun update-autoloads-in-package-area (&optional file)
"Update autoloads for files in the diretory containing this file."
(interactive)
(let ((base (file-truename
(file-name-directory
(symbol-file 'update-autoloads-in-package-area 'defun)))))
(require 'autoload) ;ironic, i know
(let ((generated-autoload-file (concat base "loaddefs.el")))
(when (not (file-exists-p generated-autoload-file))
(with-current-buffer (find-file-noselect generated-autoload-file)
(insert ";;") ;; create the file with non-zero size to appease autoload
(save-buffer)))
(cd base)
(if file
(update-file-autoloads file)
(update-autoloads-from-directories base)))))
;;;###autoload
(defun update-autoloads-for-file-in-package-area (file)
(interactive "f")
(update-autoloads-in-package-area file))
Если вы добавите 'update-autoloads-in-package-area
на ваш kill-emacs-hook
тогда loaddefs.el
будет автоматически обновляться каждый раз, когда вы выходите из Emacs.
И, чтобы связать все это вместе, добавьте это к .emacs
:
(load-file "~/emacs/lisp/loaddefs.el")
Теперь, когда вы загружаете новый пакет, просто сохраните его в ~/emacs/lisp
каталог, обновите loaddefs через M-x update-autoloads-in-package-area
(или выйдите из Emacs), и он будет доступен при следующем запуске Emacs. Больше никаких изменений в вашем .emacs
загружать вещи.
Смотрите этот вопрос, чтобы узнать о других альтернативах ускорению запуска Emacs: Как я могу ускорить запуск Emacs?
Ну, кого волнует, как медленно это начинается?
Зажги через emacs --daemon &
а затем подключиться с помощью одного из
emacsclient -c /some/file.ext
, или жеemacsclient -nw
Я создал псевдонимы для них как emx
а также emt
соответственно. Продолжение одного сеанса редактирования намного более разумно...
В идеале у вас не должно быть никаких load
или же require
в вашем .emacs
файл.
Вы должны использовать autoload
вместо...
например
(autoload 'slime-selector "slime" t)
Вам нужно будет использовать eval-after-load
чтобы выполнить какую-либо специфическую для библиотеки конфигурацию, но в результате вам не нужно ждать, пока все это загрузится, или вызвать ошибки в версиях Emacs, которые не имеют такой же функциональности. (например, на основе терминала или другой платформы и т. д.)
Хотя это может не повлиять на вас сейчас, скорее всего, в будущем вы захотите использовать одну и ту же конфигурацию на всех машинах / средах, где вы используете Emacs, так что очень хорошо, чтобы ваша конфигурация была готова к работе.
Также используйте (start-server)
и открывать внешние файлы в Emacs, используя emacsclient
- Таким образом, вы избегаете перезапуска Emacs.