emacs23 / elisp: как правильно загрузить эту библиотеку? - PullRequest
16 голосов
/ 16 ноября 2010

Я обновляюсь до emacs23. Я обнаружил, что мой emacs.el загружается гораздо медленнее.

Это действительно моя вина ... У меня там много всего.

Поэтому я также пытаюсь загрузить все возможное, что в данный момент "требуется" для моего emacs.el.

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

Правильно ли использовать 12 вызовов autoload, чтобы гарантировать, что модуль загружен независимо от того, какую функцию я вызываю? Есть ли проблемы с этим подходом? Это создаст проблемы с производительностью?

Если не , который приближается, тогда что?

Ответы [ 3 ]

22 голосов
/ 16 ноября 2010

Что вам действительно нужно, так это автоматически генерировать автозагрузки, чтобы ваш файл .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?

4 голосов
/ 16 ноября 2010

В идеале у вас не должно быть никаких load или require в вашем .emacs файле.

Вы должны быть , используя autoload вместо ...

например.

(autoload 'slime-selector "slime" t)

Вам нужно будет использовать eval-after-load, чтобы выполнить любую конфигурацию, специфичную для библиотеки, но в результате вам не нужно ждать, пока все это загрузится сразу, или вызвать ошибки в версиях Emacs, которые не имеют та же функциональность. (например, на основе терминала или другой платформы и т. д.)

Хотя это может и не повлиять на вас сейчас, скорее всего, в будущем вы захотите использовать одну и ту же конфигурацию на всех машинах / средах, где вы используете Emacs, поэтому очень хорошо иметь готовую конфигурацию.

Также используйте (start-server) и открывайте внешние файлы в Emacs, используя emacsclient - чтобы избежать перезапуска Emacs.

4 голосов
/ 16 ноября 2010

Ну, кого волнует, как медленно это начинается?

Запустите его через emacs --daemon & и затем подключите, используя один из

  • emacsclient -c /some/file.ext или
  • emacsclient -nw

Я создал псевдонимы для них как emx и emt, соответственно.Продолжение одного сеанса редактирования намного разумнее ...

...