在特定模式下手动保存 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
,因此没有添加钩子。
那么:print
不return一个字符串。它打印一个字符串,以及 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 文档开始,您将学到很多 。
我想运行untabify
在当前缓冲区上手动保存缓冲区。有没有使用 Emacs Lisp 的简单方法 运行 此函数作为 elm-mode
的保存挂钩?
这没有用:
(when (eq (print major-mode) "elm-mode")
(add-hook 'after-save-hook 'untabify))
首先,您发布的代码无法运行,因为(假设它在您的 init 文件中完全是这样写的),当 Emacs 启动时它会 运行;在这一点上,major-mode
很可能不是 elm-mode
,因此没有添加钩子。
那么:print
不return一个字符串。它打印一个字符串,以及 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 文档开始,您将学到很多 。