在特定模式下手动保存 Emacs Lisp 中的缓冲区后,如何自动 运行 一个函数?

How do I automatically run a function after manually saving a buffer in Emacs Lisp in a particular mode?

我想运行untabify在当前缓冲区上手动保存缓冲区。有没有使用 Emacs Lisp 的简单方法 运行 此函数作为 elm-mode 的保存挂钩?

这没有用:

(when (eq (print major-mode) "elm-mode")
   (add-hook 'after-save-hook 'untabify))

首先,您发布的代码无法运行,因为(假设它在您的 init 文件中完全是这样写的),当 Emacs 启动时它会 运行;在这一点上,major-mode 很可能不是 elm-mode,因此没有添加钩子。

那么:printreturn一个字符串。它打印一个字符串,以及 returns 作为参数传递的内容。在这种情况下,major-mode 是一个符号。要检查当前 major-mode 是否为 elm-mode,您可以执行 (eq major-mode 'elm-mode),有效地比较符号。 作为旁注,eq 不适用于字符串比较,请使用 string=string-equal.

你要做的是无条件地向 after-save-hook 添加一个钩子,并在钩子内部检查你是否应该执行该操作:

(add-hook 'after-save-hook (lambda ()
                             (when (eq major-mode 'elm-mode)
                               (untabify (point-min) (point-max)))))

您需要为 untabify 提供参数。在那种情况下,它只是取消了整个缓冲区。

另一种方法是添加一个缓冲区本地挂钩,使用类似

的方法
(add-hook 'elm-mode-hook (lambda ()
                           (add-hook 'after-save-hook <my-function> nil t)))

一如既往:查看 manual,可以在 Emacs 中以 info 模式访问,在 add-hook 上使用 describe-function,等等。一般来说,如果您从尝试查看 built-in 文档开始,您将学到很多