在Emacs中,如何在调用(require'x)时加载某个文件?

时间:2009-09-03 17:20:59

标签: emacs elisp

CEDET我需要eassist eassist-list-methods 非常方便)。在eassist.el中有一行

(require 'semantic)

如果未加载CEDET则失败。问题是我一直不需要CEDET,加载需要很长时间,所以我想推迟加载,直到我调用 eassist-list-methods

有没有办法运行

(load "cedet")

语义(或其他由CEDET提供的内容)必需时?

我正在寻找一种不会改变eassist.el的简单解决方案。

3 个答案:

答案 0 :(得分:4)

Genehack可能是对的;我在回答这个问题时过于文字化了。处理这类事情的最佳方法是确定外部代码需要哪些函数,并为它们添加autoload

但如果autoload在你的情况下不起作用,那么在加载文件时执行某些操作的正常方法就是

(eval-after-load "semantic" '(load "cedet"))

但我只是注意到你说如果没有先加载CEDET,semantic.el就无法加载。正如名称所暗示的那样,eval-after-load在加载指定文件后运行代码

您可以尝试查找不同的文件来触发加载,而不是使用semantic.el。 (也许是semantic.el需要的其他文件。)

如有必要,您可以加入require

(defadvice require (before CEDET-require activate)
  (if (eq 'semantic (ad-get-arg 0))
      (load "cedet")))

虽然(load "cedet")可能应该是(require 'cedet),但您每次都会重新加载它。 (我不确定CEDET是否有(provide 'cedet),所以在我的例子中我没有这样做。)

请注意,如果已加载语义,则在require上提供建议将不会执行任何操作,因此您可能需要首先检查(featurep 'semantic)并在必要时立即加载cedet.el。

答案 1 :(得分:1)

假设您的load-path中包含所有CEDET内容:

(autoload 'eassist-list-methods "cedet" nil t)
你的.emacs.d/init.el(或其他初始文件)中的

应该可以解决问题。

答案 2 :(得分:0)

我可能会误解你,但如果不是,答案是 autoload :你只想在调用其中一个命令时加载eassist.el。当它加载时,它将加载semantic或CEDET或它需要的任何东西 - 这不是你的问题(它应该由库eassist.el的设计来处理。)

(autoload 'eassist-list-methods "eassist" nil t)