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.

Другие вопросы по тегам