1

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

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

语言

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

我的python-setup.el

(require 'python)
; ...

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

语言

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

我的-c-setup.el

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

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

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

3 回答 3

5

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

为了解决您的问题,我们必须考虑您真正想要做的事情:您只是希望在某个时刻加载您的一些代码,或者您是否希望对缓冲区中的缓冲区进行本地缓冲区自定义c-mode

如果你只是想让 Emacs 在启动时加载你的代码,要么将你的代码直接放入你的.emacs文件中,要么使用load-fileorrequire代替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都可以在该目录中找到代码。

另一种方法是提供/要求机制:您可以通过在其中进行调用来使您的 .el 文件“提供”某些功能(provide 'feature),例如

(provide 'my-c-mode-customizations)

然后(require 'feature)在您的 .emacs 文件中添加一个相应的内容,您的代码也将被加载:

(require 'my-c-mode-customizations)

但是,如果您希望仅在缓冲区上激活时才加载代码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)

当然,您仍然需要autoloadEmacs 实际找到该函数的定义。

于 2011-04-23T09:55:56.457 回答
1

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

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

于 2011-04-23T09:47:19.957 回答
1

自动加载不会像您认为的那样做。
http://www.gnu.org/software/emacs/elisp/html_node/Autoload.html

您可能想要的是 mode-hooks 或 eval-after-load。有关两者之间的区别,请参阅eval-after-load 与 mode 挂钩。

于 2011-04-23T09:55:01.883 回答