如何在 Emacs lisp 中切换命令?

How to toggle a command in Emacs lisp?

我想要一个可以在 Emacs 中切换行号显示的快捷方式。

这是我目前拥有的:

(defun my-toggle-display-line-numbers-mode-function ()
"Toggles the line numbers"
  (interactive)
  (display-line-numbers-mode)
  )
(global-set-key [(f7)] 'my-toggle-display-line-numbers-mode-function)

但它只会打开行号。我无法将其关闭,这与我使用 M-x display-line-numbers-mode 时不同,它可以毫无问题地打开或关闭。

知道如何改进我的脚本以使其按预期工作吗?

describe-function (C-h f) 在 display-line-numbers-mode 上给出以下内容:

Signature:
(display-line-numbers-mode &optional ARG)

Documentation:
[...]
This is a minor mode.  If called interactively, toggle the
Display-Line-Numbers mode mode. [...]

If called from Lisp, toggle the mode if ARG is toggle.  Enable
the mode if ARG is nil, omitted, or is a positive number.
Disable the mode if ARG is a negative number.

这是define-minor-mode宏生成的自动描述,对于大多数次要模式,之前的文档将完全相同。

我们从中得到什么:

  • 当以交互方式调用时(作为命令,使用例如M-x display-line-numbers-mode)这作为一个切换。
  • Elisp 源代码调用时,您需要指定一个参数。

如果您希望它充当切换开关,请在您的代码中使用 (display-line-numbers-mode 'toggle)。如果你想要比简单的切换稍微高级的东西(例如,检查一些额外的条件),使用 1 和 -1 作为参数分别启用和禁用模式(顺便说一句,虽然文档不清楚,但 0 算作否定数字 这里 ,所以 (display-line-numbers-mode 0) 禁用模式。

通常情况下,Emacs built-in 文档显示了所有需要了解的内容。尝试熟悉帮助系统,与许多软件相比,它确实好。