我想编写一个Emacs函数,它将打开flyspell-mode,而不管模式的当前状态如何。不建议使用函数flyspell-mode-on。文档表明,一个肯定的前缀参数将使flyspell-mode转,但不幸的是,运行
(flyspell-mode 1)结果会出现错误消息:
Wrong number of arguments: (lambda (flyspell-mode 1)), 0如果我能弄清楚如何用前缀参数调用flyspell-mode,我相信我可以解决这个问题。
我能在Emacs手册中找到的最相关的部分是题为“交互式调用”的部分,该部分描述了诸如call-interactively这样的命令。这绝对不是我想要的。
(我试图解决的最终问题是创建一个模式钩子,它可以打开模式,而不管其当前状态如何。)
注:问题带前缀参数的emacs lisp调用函数编程的标题使它看起来是相关的,但是这个问题是关于如何创建一个交互式命令的,这个问题最终通过使用call-interactively解决了。
编辑:这个问题是没有意义的;我找到了一个替代方案来解决我原来的问题:
(add-hook 'text-mode-hook
(function (lambda ()
(require 'flyspell)
(if flyspell-mode nil (flyspell-mode)))))但是,我仍然想知道如何从另一个Emacs函数调用带前缀参数的Emacs函数,而没有任何交互。
UPDATE:也许我应该问一下为什么我会收到错误信息.
发布于 2012-02-23 01:09:49
看起来,您的Fly拼写模式不遵循次要模式约定,它要求您可以使用(name-of-mode t)或任何正前缀参数打开次要模式,使用(name-of-mode 0)关闭它--任何负前缀参数,然后使用(name-of-mode nil)切换它。
如果您有最新版本的Fly拼写,则可能会出现错误报告。我的机器上有GNUEmacs23.2版,它尊重惯例。我的版本还定义了两个函数turn-on-flyspell和turn-off-flyspell,这两个函数都是围绕flyspell-mode的琐碎包装;具有这样名称的函数是常见的,但不是正式的约定。函数flyspell-mode-on和flyspell-mode-off显然是为了内部使用。
通常情况下,命令从current-prefix-arg变量读取当前前缀参数。不要把它与prefix-arg混为一谈,它是下一个命令的值(只有几个命令,比如universal-argument,可以触摸这个变量)。因此,如果在调用函数时需要传递前缀参数,则绑定或设置current-prefix-arg。
(let ((current-prefix-arg t))
(flyspell-mode))发布于 2012-02-22 10:50:39
我能想到这个..。应该会更好
(call-interactively (lambda ()
(interactive)
(flyspell-mode '(4))))更新:我可以直接运行。我在这个问题上遗漏了什么?
(flyspell-mode '(4))编辑:删除lambda表达式的引号(我添加了这个注释,因为SX强制编辑至少有6个字符长,因此可以删除)。
发布于 2012-02-23 03:56:01
FWIW,至少从Emacs-21开始,‘Fly拼写模式’函数已经接受了一个参数(如“(Fly拼写-模式1)"),所以我不知道您是如何得到这个错误的。
但是当我在这里的时候,我不妨指出(Ad-钩子的文本模式-钩子的反拼写模式)已经改变了Emacs-24中的意思:不再意味着“在文本模式中切换拼写模式”,而是“在文本模式中启用拼写模式”。这是一个向后兼容的变化,但我相信它将修复比它将要引入的更多潜在的错误。
https://stackoverflow.com/questions/9387816
复制相似问题