emacs23 / elisp:如何正确自动加载这个库?

时间:2010-11-15 21:50:42

标签: emacs autoload

我正在升级到emacs23。我发现我的emacs.el加载速度要慢得多。

这真是我自己的错......我在那里有很多东西。

所以我也尝试自动加载我的emacs.el当前“必需”的所有可能内容。

我有一个模块,可以公开12个入口点 - 我可以调用的交互式功能。

正确的方法是对autoload进行12次调用,以确保无论我调用哪个函数都加载了模块?这种方法有什么问题吗?它会出现性能问题吗?

如果不是方法,那又怎样?

3 个答案:

答案 0 :(得分:22)

您真正想要的是自动为您生成自动加载,以便您的.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,则每次退出Emacs时都会自动更新loaddefs.el

并且,要将它们组合在一起,请将其添加到.emacs

(load-file "~/emacs/lisp/loaddefs.el")

现在,当您下载新软件包时,只需将其保存在~/emacs/lisp目录中,通过M-x update-autoloads-in-package-area更新loaddef(或退出emacs),它将在您下次运行时可用Emacs的。您的.emacs无需更改即可加载内容。

有关加速Emacs启动的其他替代方法,请参阅此问题:How can I make Emacs start-up faster?

答案 1 :(得分:4)

嗯,谁在乎它开始的缓慢程度?

通过emacs --daemon &启动它,然后使用

之一进行连接
  • emacsclient -c /some/file.ext
  • emacsclient -nw

我分别为emxemt创建了这两个别名。继续一次编辑会议是如此安全......

答案 2 :(得分:4)

理想情况下,您的load文件中不应包含任何require.emacs

你应该是using autoload instead...

e.g。

(autoload 'slime-selector "slime" t)

您需要使用eval-after-load来执行任何特定于库的配置,但结果是您不需要等待所有这些都在前面加载,或者导致错误的Emacs版本出错具有相同的功能。 (例如基于终端,或不同的平台等)

虽然现在这可能不会对您产生影响,但是将来您可能希望在使用Emacs的所有机器/环境中使用相同的配置,因此准备好配置是一件非常好的事情。< / p>

同时使用(start-server)并将外部文件打开到Emacs using emacsclient - 这样就可以避免重启Emacs。