首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Emacs c模式自动加载失败

Emacs c模式自动加载失败
EN

Stack Overflow用户
提问于 2011-04-23 09:40:35
回答 3查看 2K关注 0票数 1

当c模式加载时,我想加载名为"my-c-setup.el“的文件。所以,我用的是"autoload“函数。

在我的python设置中,它工作得很好:

lang.el

代码语言:javascript
复制
(autoload 'python-mode "my-python-setup" "" t)

my-python-setup.el

代码语言:javascript
复制
(require 'python)
; ...

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

lang.el

代码语言:javascript
复制
(autoload 'c-mode "my-c-setup" "" t)

my-c-setup.el

代码语言:javascript
复制
(setq c-basic-offset 4)
; ...

当我试图以c模式(例如test.c)打开一个文件时,我有以下错误:

代码语言:javascript
复制
File mode specification error: (error "Autoloading failed to define function c-mode")
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-23 09:55:56

这不是你要找的东西。它所做的只是在第一次需要的时候加载一些代码,这是扩展Emacs功能的一种方便的方法,同时仍然保持启动时间较短。

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

如果您只是希望Emacs在启动时加载您的代码,可以将代码直接放入您的.emacs文件中,或者使用load-filerequire代替autoload

load-file只需取一个文件名,加载该文件中的lisp代码并对其进行计算。因此,如果您的代码位于一个名为"/path/to/my-c-setup.el“的文件中,您可以在您的.emacs中放置以下行,并且代码将在每次启动时加载:

代码语言:javascript
复制
(load-file "/path/to/my-c-setup.el")

也许您不想为加载的每个文件提供绝对路径名称。在这种情况下,您可以使用函数load-library,它类似于load-file,但是尝试在存储在变量load-path中的任何目录中找到给定的文件名。

代码语言:javascript
复制
(add-to-list 'load-path "/path/to")
(load-library "my-c-setup.el")

优点是您只需执行add-to-list部分一次,所有对load-library的后续调用都可以在该目录中找到代码。

另一种方法是提供/要求机制:您可以通过在..el文件中添加一个(provide 'feature)调用来使..el文件“提供”某些特性。

代码语言:javascript
复制
(provide 'my-c-mode-customizations)

然后在您的(require 'feature)文件中放置一个符合的.emacs,您的代码也会被加载:

代码语言:javascript
复制
(require 'my-c-mode-customizations)

但是,如果只希望在缓冲区中激活c-mode时才加载代码,则实现此目的的方法是通过Emacs的钩子机制:

钩子是一个变量,您可以在其中存储一个或多个函数,以便在特定情况下由现有程序调用。

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

代码语言:javascript
复制
(add-hook 'c-mode-hook 'my-c-mode-customizations)

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

票数 5
EN

Stack Overflow用户

发布于 2011-04-23 09:47:19

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

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

票数 1
EN

Stack Overflow用户

发布于 2011-04-23 09:55:01

阿托洛阿德不做你想做的事。

节点/Autoload.html

你可能想要的是模式挂钩或负载后评估。有关两者之间的差异,请参见加载后与模式挂钩

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5763458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档