Подтвердить что ты не робот

Emacs23/elisp: как правильно автозагрузить эту библиотеку?

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

Это моя собственная ошибка... У меня там много чего.

Так что я также пытаюсь автозагрузить все возможное, что в настоящее время "требуется" моим emacs.el.

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

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

Если не этот подход, то что?

4b9b3361

Ответ 1

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

Ответ 2

Ну, кто заботится о том, как медленно он начинается?

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

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

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

Ответ 3

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

Вы должны использовать autoload вместо...

например.

(autoload 'slime-selector "slime" t)

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

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

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