我想在加载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")
答案 0 :(得分:5)
Autoload不是您想要的。它所做的只是在第一次需要时加载一些代码,这是扩展Emacs功能同时仍然保持较低启动时间的便捷方式。
要解决您的问题,我们必须考虑您真正想要做的事情:您是否只是希望在某些时候加载某些代码,或者您是否希望缓冲区本地自定义为{{{ 1}}?
如果您只是希望Emacs在启动时加载代码,请将代码直接放入c-mode
文件中,或使用.emacs
或load-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了解两者之间的差异。