Emacs c模式自动加载失败

时间:2011-04-23 09:40:36

标签: emacs emacs23 c-mode

我想在加载c模式时加载名为“my-c-setup.el”的文件。所以,我正在使用“autoload”功能。

使用我的python设置,它运行良好:

lang.el

(autoload 'python-mode "my-python-setup" "" t)

我-蟒-setup.el

(require 'python)
; ...

我正在尝试对c模式做同样的事情,但我不起作用:

lang.el

(autoload 'c-mode "my-c-setup" "" t)

我-C-setup.el

(setq c-basic-offset 4)
; ...

当我尝试以c-mode(例如test.c)打开文件时,出现以下错误:

File mode specification error: (error "Autoloading failed to define function c-mode")

3 个答案:

答案 0 :(得分:5)

Autoload不是您想要的。它所做的只是在第一次需要时加载一些代码,这是扩展Emacs功能同时仍然保持较低启动时间的便捷方式。

要解决您的问题,我们必须考虑您真正想要做的事情:您是否只是希望在某些时候加载某些代码,或者您是否希望缓冲区本地自定义为{{{ 1}}?

如果您只是希望Emacs在启动时加载代码,请将代码直接放入c-mode文件中,或使用.emacsload-file代替require

autoload只需要一个文件名,在该文件中加载lisp代码并对其进行评估。因此,如果您的代码位于名为“/path/to/my-c-setup.el”的文件中,则可以在.emacs中添加以下行,并在每次启动时加载代码:

load-file

也许您不想为您加载的每个文件指定绝对路径名。在这种情况下,您可以使用与(load-file "/path/to/my-c-setup.el") 类似的函数load-library,但尝试在变量load-file中存储的任何目录中查找给定的文件名:

load-path

优势在于您只需执行一次(add-to-list 'load-path "/path/to") (load-library "my-c-setup.el") 部分,并且对add-to-list的所有后续调用都可以在该目录中找到代码。

另一种方法是提供/要求机制:您可以通过在其中添加load-library来使您的.el文件“提供”某些功能,例如

(provide 'feature)

然后在您的.emacs文件中添加一个(provide 'my-c-mode-customizations) ,您的代码也将被加载:

(require 'feature)

但是,如果您希望仅在缓冲区上激活(require 'my-c-mode-customizations) 时加载代码,则实现此目的的方法是通过Emacs的Hook机制:

  

钩子是你可以的变量   存储一个或多个功能   在一个特定的场合呼唤一个   现有的计划。

大多数主要模式都提供了一个可自定义的钩子变量,您可以在其中添加在调用主模式时将调用的函数。例如,c-mode提供c-mode。为了在为缓冲区打开c-mode时调用自己的自定义,请将它们放在一个函数中,例如c-mode-hook并将以下行添加到.emacs文件中:

my-c-mode-customizations

当然,你仍然需要(add-hook 'c-mode-hook 'my-c-mode-customizations) 让Emacs真正找到该功能的定义。

答案 1 :(得分:1)

Lisp的autoload在加载文件时不调用函数,但告诉lisp该函数可用且给定文件提供该函数。每当有人调用(尚未定义)函数时,文件就会被加载。

我认为c-mode已经定义,因此无法重新注册。

答案 2 :(得分:1)

Autoload不按照您的想法行事 http://www.gnu.org/software/emacs/elisp/html_node/Autoload.html

您可能需要的是模式挂钩或eval-after-load。 请参阅eval-after-load vs. mode hook了解两者之间的差异。