代码之家  ›  专栏  ›  技术社区  ›  Cheeso

emacs23/elisp:如何正确地自动加载此库?

  •  16
  • Cheeso  · 技术社区  · 14 年前

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

    这是我自己的错,真的…我有很多东西在里面。

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

    我有一个模块可以显示12个入口点——我可以调用的交互函数。

    打12个电话的正确方法是 autoload 为了确保加载模块而不管调用哪个函数?这种方法有什么问题吗?它会出现性能问题吗?

    如果没有 那个 接近,然后呢?

    3 回复  |  直到 12 年前
        1
  •  22
  •   Community datashaman    7 年前

    您真正想要的是自动生成自动加载,以便.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启动速度的其他备选方案,请参阅此问题: How can I make Emacs start-up faster?

        2
  •  4
  •   ocodo    14 年前

    好吧,谁在乎开始的速度有多慢?

    通过点火 emacs --daemon & 然后使用

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

    我为这两个创建了别名 emx emt ,分别。一旦编辑会议继续是如此理智…

        3
  •  4
  •   ocodo    14 年前

    理想情况下你不应该有 load require 在你的 .emacs 文件。

    你应该是 using autoload instead...

    例如

    (autoload 'slime-selector "slime" t)
    

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

    虽然这现在可能不会影响您,但很可能将来您会希望在所有使用Emacs的计算机/环境上使用相同的配置,所以准备好运行配置是一件非常好的事情。

    同时使用 (start-server) 并将外部文件打开到 Emacs using emacsclient -所以避免重新启动Emacs。