emacs - 如何从另一个 Emacs Lisp 函数调用带有前缀参数的交互式 Emacs Lisp 函数?

标签 emacs elisp

我想写一个 Emacs Lisp 函数来开启 flyspell-mode无论模式的当前状态如何。功能 flyspell-mode-on已弃用。文档建议正前缀参数将变为 flyspell-mode ,但不幸的是正在运行

(flyspell-mode 1)

导致错误消息:
Wrong number of arguments: (lambda (flyspell-mode 1)), 0

如果我能弄清楚如何调用flyspell-mode使用前缀参数,我相信我可以解决这个问题。

我可以在 Emacs Lisp 手册中找到最相关的部分是标题为“交互式调用”的部分,它描述了诸如 call-interactively 之类的命令。 .这显然不是我想要的。

(我试图解决的最终问题是创建一个模式 Hook ,无论其当前状态如何,它都会打开模式。)

注:问题标题emacs lisp call function with prefix argument programmatically使它看起来是相关的,但该问题是询问如何创建交互式命令,最终通过使用 call-interactively 解决了该问题.

编辑 : 这个问题没有实际意义;我找到了原始问题的替代解决方案:
(add-hook 'text-mode-hook
          (function (lambda ()
                      (require 'flyspell)
                      (if flyspell-mode nil (flyspell-mode)))))

但是我仍然想知道如何从另一个 Emacs Lisp 函数调用带有前缀参数的 Emacs Lisp 函数,而没有任何交互。

更新 : 也许我应该问为什么我会收到那个错误信息......

最佳答案

您的 Flyspell 模式版本似乎不遵循 minor mode conventions ,这要求您可以使用 (name-of-mode t) 打开次要模式或任何正前缀参数,用 (name-of-mode 0) 关闭它任何否定前缀参数,并用 (name-of-mode nil) 切换它.

如果您拥有最新版本的 Flyspell,则可能需要提交错误报告。我的机器上有 GNU Emacs 23.2 附带的版本,它遵守约定。我的版本还定义了两个函数turn-on-flyspellturn-off-flyspell , flyspell-mode 周围的两个微不足道的包装器;具有此类名称的函数很常见,但不是官方约定。功能 flyspell-mode-onflyspell-mode-off显然是供内部使用的。

一般来说,命令从 current-prefix-arg 读取当前前缀参数。多变的。不要将其与 prefix-arg 混淆,这是下一个命令的值(只有少数命令,如 universal-argument 触摸此变量)。因此,如果您需要在调用函数时传递前缀参数,请绑定(bind)或设置 current-prefix-arg .

(let ((current-prefix-arg t))
  (flyspell-mode))

关于emacs - 如何从另一个 Emacs Lisp 函数调用带有前缀参数的交互式 Emacs Lisp 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9387816/

相关文章:

macos - shebang emacs --脚本作为 bash 运行

emacs - Dired:重复文件(操作,而不是如何摆脱它们)

emacs - 如何在 emacs 中用换行符(LF)替换空格字符?

emacs - elisp:在批处理模式下静音 "Loading"消息

emacs - 根据 PWD 更新多项缓冲区名称

emacs - 是否可以在 Emacs 中分离 minibuffer 和 echo 区域?

emacs - 向 Emacs-Lisp 添加注释结束字符

emacs - 在 Elisp 中调试 "Error setting nil"

emacs lisp 以编程方式调用带有前缀参数的函数

emacs - @ 字符在 Emacs Lisp 中的作用是什么?