【问题标题】:The major mode name of emacs-lispemacs-lisp 的主要模式名称
【发布时间】:2013-10-01 14:05:55
【问题描述】:

我想更快地加载 emacs 初始化文件,所以我使用了 'eval-after-load。
例如,当我加载 clojure 文件时,我只是把

(eval-after-load 'clojure-mode
    'do-something)

它有效。
但是当我尝试

(eval-after-load 'emacs-lisp-mode
    'do-something)

它不起作用。我想知道emacs-lisp正确的主要模式名称。
谢谢。

【问题讨论】:

  • 当 Emacs 启动时,它会自动打开一个处于 lisp-interaction-mode 的 scratch 缓冲区。此模式在 lisp-mode.el 中定义。这意味着 lisp 模式在您启动 emacs 时始终加载,因此无论您是否将其包装在 eval-after-load 中,do-something 都会运行。

标签: emacs clojure elisp major-mode eval-after-load


【解决方案1】:

请阅读documentation of eval-after-load

加载后评估库格式

此函数安排在加载文件 LIBRARY 结束时评估表单,每次加载 LIBRARY。如果 LIBRARY 已经加载,它会立即评估表单。不要忘记引用表格!

[...] LIBRARY 也可以是一个特征(即一个符号),在这种情况下,形式会在任何调用 (provide LIBRARY) 的文件的末尾进行评估。

您必须将定义主要模式的文件或库的名称作为参数传递。

虽然某些模式在同名文件中定义(例如 clojure-mode.el 中的 clojure-mode),但许多文件的名称不同,尤其是在实际定义多个主要模式时。

emacs-lisp-modelisp-mode.el 中定义,以及用于 Emacs Lisp 编辑的其他一些模式(例如,lisp-mode 作为通用 Lisp 语言模式,或 lisp-interaction-mode 用于 *scratch* 缓冲区)。

因此,使用(eval-after-load 'lisp-mode …)

此外,您必须提供一个 sexp 作为第二个参数,因此您可能希望使用 (eval-after-load 'lisp-mode '(do-something)) 来调用函数 do-something

如果您使用的是 Emacs 的快照版本,请使用 with-eval-after-load,即 (with-eval-after-load 'lisp-mode (do-something))。它允许使用多个表单,并且不需要引用。

【讨论】:

    【解决方案2】:

    只需使用M-: 变量major-mode 进行评估。它实际上是emacs-lisp-mode。 注意*scratch*实际上在lisp-interaction-mode中。

    至于您要做什么,请使用(eval-after-load "lisp-mode")

    【讨论】:

      【解决方案3】:

      正如@lunaryom 所解释的,传递给eval-after-load 的arg 不是函数名而是功能名,本质上是一个文件名。因此,您需要找到从中加载函数的文件的名称。 我们可以提供像eval-after-defun 这样的功能,确实这样做可能是个好主意。如果您想要这样的东西,请通过M-x report-emacs-bug 索取。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-16
        相关资源
        最近更新 更多