我该如何在Emacs中覆盖默认的模式文件?

3

我想用另一个文件覆盖默认的Emacs cc-mode.el。在我的.emacs文件中,我有以下行:

(add-to-list 'load-path "/usr/home/smooth/emacs" t)

这可以正确加载本地Emacs配置文件。例如:
(require 'go-mode-autoloads)

本文介绍如何从上面的目录中加载go-mode.el。我尝试将所需的cc-mode.el文件放置在上述目录中,以期覆盖默认的Emacs c-mode。然而,它没有加载我放在/usr/home/smooth/emacs中的cc-mode.el文件,而是继续使用默认的文件。

如何使Emacs使用我的cc-mode.el文件而不是默认的文件?我已经在Google上广泛搜索并尝试了Emacs Wiki,但是找不到正确的页面。

或者,我该如何设置Emacs使用系统默认的c-mode文件之外的另一个文件?我不介意将当前的cc-mode.el重命名为其他名称。

我的Emacs版本是25.2。


一般情况下,只要在您的load-path修改之前未加载cc-mode,您所做的操作应该可以正常运行。 - phils
查看Emacs Wiki,我注意到“load-path”末尾没有“t”,所以我将其删除后它开始工作了。上面的“t”可能是问题的根源。非常奇怪的是,我试图解决的cc-mode中的错误也消失了。上述的“t”可能会导致其他错误。请参阅https://www.emacswiki.org/emacs/LoadPath获取Emacs Wiki页面。 - Smooth Criminal
我找到了这个页面:https://www.gnu.org/software/emacs/manual/html_node/elisp/List-Variables.html。它说:“通常情况下,如果添加元素,则将其添加到符号的前面,但是如果可选参数append为非nil,则将其添加到末尾。”看起来我是在末尾添加的。我不确定为什么会导致cc-mode出现如此严重的问题,因为直到几天前我切换到emacs 25.2之前都一直在工作。现在它已经正常工作了。 - Smooth Criminal
上面的“t”可能是问题的起源。没错 - 我没有注意到你代码中的APPEND参数。在load-path中使用它是不寻常的,因为如果Emacs在列表中的较早目录未找到库,则只会查找该目录。您已经成功回答了自己的问题,因此可以将其发布为答案并接受它。 - phils
2个回答

1
看了Emacs维基,我注意到"load-path"末尾没有“t”,所以我把它删除了,然后它开始工作了。上面的“t”可能是问题的起源。非常奇怪的是,我试图规避的cc-mode不良行为也消失了。上述的“t”可能引起了其他某些错误。请参见emacswiki.org/emacs/LoadPath以获取Emacs维基页面。
我找到了这个页面:gnu.org/software/emacs/manual/html_node/elisp/…。它说:“通常情况下,如果元素被添加,它会被添加到符号的前面,但是如果可选参数附加是非nil,则会在末尾添加。似乎我是在末尾添加的。我不确定为什么那会彻底破坏cc-mode,因为直到几天前我切换到emacs 25.2之前都一直在工作。现在它正常工作了。

通常,add-to-list 中的可选参数,例如 APPEND,是布尔类型的,即它们只关心是 nil 还是非 nil。在这种情况下,我喜欢给它们提供描述性值,比如 (add-to-list 'load-path "foo" 'append) - jpkotta

0

您可以使用load-library(或load)来无条件地加载库,即使它提供的功能已经被提供(例如,由另一个库或已经加载的同一库的另一个版本提供)。

只需将要加载的库放在靠近您的load-path开头的目录中,然后调用load-library

[但是,请注意,加载(或重新加载)库并不会取消已经评估过的defvars和defcustoms。例如,如果库foo.el有一个foo-option的defcustom,并且已经被加载,然后您加载自己的版本foo.el,其中有这样的defcustom,但具有不同的默认值,则您的版本将被忽略。这是defvardefcustom的行为的一部分。]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接