【问题标题】:Emacs c-mode autoloading failedEmacs c-mode 自动加载失败
【发布时间】:2011-08-11 10:20:44
【问题描述】:

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

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

lang.el

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

my-python-setup.el

(require 'python)
; ...

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

lang.el

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

my-c-setup.el

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

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

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

【问题讨论】:

    标签: emacs emacs23 c-mode


    【解决方案1】:

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

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

    如果您只是希望 Emacs 在启动时加载您的代码,请将您的代码直接放入您的 .emacs 文件或使用 load-filerequire 而不是 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 的所有调用都可以在该目录中找到代码。

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

    (provide 'my-c-mode-customizations)
    

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

    (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)
    

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

    【讨论】:

      【解决方案2】:

      自动加载并没有像你想象的那样做。
      http://www.gnu.org/software/emacs/elisp/html_node/Autoload.html

      您可能想要的是 mode-hooks 或 eval-after-load。 两者的区别见eval-after-load vs. mode hook

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2023-03-18
          • 1970-01-01
          • 2011-11-24
          • 1970-01-01
          • 1970-01-01
          • 2012-04-12
          • 1970-01-01
          • 2012-09-13
          • 1970-01-01
          相关资源
          最近更新 更多