Emacs c模式自动加载失败

问题描述:

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

随着我的Python安装,它工作得很好:

lang.el

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

我的Python-setup.el

(require 'python) 
; ... 

我米试图做与c模式相同,但id OES不行:

lang.el

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

我-C-setup.el

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

当我尝试打开C模式(一个文件测试。 c例如),我有以下错误:

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

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

为了解决您的问题,我们必须考虑您真正想要做什么:您是否希望某些代码在某个时间点被加载,或者您是否希望缓冲区的缓冲区本地自定义为c-mode

如果你只是想Emacs在启动时加载你的代码,可以直接把你的代码放到你的.emacs文件或使用load-filerequire代替autoload

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

(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将能够找到该目录中的代码。另一种方法是提供/需求机制:你可以通过在其中添加(provide 'feature)调用来使你的.el文件“提供”一些功能,例如,通过拨打(provide 'feature)

(provide 'my-c-mode-customizations) 

然后把一个根据(require 'feature)在你的.emacs文件,你的代码将被加载,以及:

(require 'my-c-mode-customizations) 

但是,如果要在c-mode是在激活了您的代码只加载缓冲器,以实现该方法是通过Emacs的Hook机构:

钩是一个变量,其中可以 存储一个功能或多个功能,以由 现有程序在特定场合呼叫 。

大多数主要模式提供了一个可定制的挂钩变量,您可以添加将调用主模式时调用的函数。例如,c模式提供c-mode-hook。为了让自己的自定义每当C模式开启时的缓冲区的调用,把它们放在一个功能,比方说,my-c-mode-customizations和下面的行添加到您的.emacs文件:

(add-hook 'c-mode-hook 'my-c-mode-customizations) 

当然, Emacs仍然需要autoload才能找到该函数的定义。

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

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

自动加载不会做你认为它的作用。
http://www.gnu.org/software/emacs/elisp/html_node/Autoload.html

你可能想要的是模式挂钩或加载后评估。 查看eval-after-load vs. mode hook两者之间的区别。