San*_*nda 1 emacs emacs23 c-mode
我想在加载c模式时加载名为"my-c-setup.el"的文件.所以,我正在使用"autoload"功能.
使用我的python设置,它运行良好:
lang.el
(autoload 'python-mode "my-python-setup" "" t)
Run Code Online (Sandbox Code Playgroud)
我的Python-setup.el
(require 'python)
; ...
Run Code Online (Sandbox Code Playgroud)
我试图用c模式做同样的事,但我不行:
lang.el
(autoload 'c-mode "my-c-setup" "" t)
Run Code Online (Sandbox Code Playgroud)
我-C-setup.el
(setq c-basic-offset 4)
; ...
Run Code Online (Sandbox Code Playgroud)
当我尝试以c模式打开文件(例如test.c)时,出现以下错误:
File mode specification error: (error "Autoloading failed to define function c-mode")
Run Code Online (Sandbox Code Playgroud)
Autoload不是您想要的.它所做的只是在第一次需要时加载一些代码,这是扩展Emacs功能同时仍然保持低启动时间的便捷方式.
要解决您的问题,我们必须考虑您真正想要做的事情:您是否只是希望在某些时候加载某些代码,或者您是否希望缓冲区本地自定义以适应永久缓冲区c-mode?
如果您只是希望Emacs在启动时加载代码,请将代码直接放入您的.emacs文件或使用load-file或require代替autoload:
load-file只需获取文件名,在该文件中加载lisp代码并对其进行评估.因此,如果您的代码位于名为"/path/to/my-c-setup.el"的文件中,则可以在.emacs中添加以下行,并在每次启动时加载代码:
(load-file "/path/to/my-c-setup.el")
Run Code Online (Sandbox Code Playgroud)
也许您不想为您加载的每个文件指定绝对路径名.在这种情况下,您可以使用load-library类似的函数,load-file但尝试在存储在变量中的任何目录中查找给定的文件名load-path:
(add-to-list 'load-path "/path/to")
(load-library "my-c-setup.el")
Run Code Online (Sandbox Code Playgroud)
优点是您必须add-to-list只执行一次该部件,并且所有后续调用load-library将能够在该目录中查找代码.
另一种方法是提供/要求机制:您可以通过在其中(provide 'feature)调用来使您的.el文件"提供"某些功能,例如
(provide 'my-c-mode-customizations)
Run Code Online (Sandbox Code Playgroud)
然后(require 'feature)在你的.emacs文件中放入一个相应的,你的代码也将被加载:
(require 'my-c-mode-customizations)
Run Code Online (Sandbox Code Playgroud)
但是,如果您希望仅c-mode在缓冲区上激活时加载代码,则实现此目的的方法是通过Emacs的Hook机制:
钩子是一个变量,您可以在其中存储要在特定场合由现有程序调用的函数.
大多数主要模式都提供了一个可自定义的钩子变量,您可以在其中添加在调用主模式时将调用的函数.例如,c-mode提供c-mode-hook.为了在为缓冲区打开c-mode时调用自己的自定义,将它们放在一个函数中,比如说,my-c-mode-customizations并将以下行添加到.emacs文件中:
(add-hook 'c-mode-hook 'my-c-mode-customizations)
Run Code Online (Sandbox Code Playgroud)
当然,您仍然需要autoloadEmacs才能真正找到该函数的定义.