首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从另一个Emacs函数调用带有前缀参数的交互式Emacs函数?

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

Stack Overflow用户
提问于 2012-02-22 01:10:23
回答 4查看 7.3K关注 0票数 15

我想编写一个Emacs函数,它将打开flyspell-mode,而不管模式的当前状态如何。不建议使用函数flyspell-mode-on。文档表明,一个肯定的前缀参数将使flyspell-mode转,但不幸的是,运行

代码语言:javascript
复制
(flyspell-mode 1)

结果会出现错误消息:

代码语言:javascript
复制
Wrong number of arguments: (lambda (flyspell-mode 1)), 0

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

我能在Emacs手册中找到的最相关的部分是题为“交互式调用”的部分,该部分描述了诸如call-interactively这样的命令。这绝对不是我想要的。

(我试图解决的最终问题是创建一个模式钩子,它可以打开模式,而不管其当前状态如何。)

注:问题带前缀参数的emacs lisp调用函数编程的标题使它看起来是相关的,但是这个问题是关于如何创建一个交互式命令的,这个问题最终通过使用call-interactively解决了。

编辑:这个问题是没有意义的;我找到了一个替代方案来解决我原来的问题:

代码语言:javascript
复制
(add-hook 'text-mode-hook
          (function (lambda ()
                      (require 'flyspell)
                      (if flyspell-mode nil (flyspell-mode)))))

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

UPDATE:也许我应该问一下为什么我会收到错误信息.

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-23 01:09:49

看起来,您的Fly拼写模式不遵循次要模式约定,它要求您可以使用(name-of-mode t)或任何正前缀参数打开次要模式,使用(name-of-mode 0)关闭它--任何负前缀参数,然后使用(name-of-mode nil)切换它。

如果您有最新版本的Fly拼写,则可能会出现错误报告。我的机器上有GNUEmacs23.2版,它尊重惯例。我的版本还定义了两个函数turn-on-flyspellturn-off-flyspell,这两个函数都是围绕flyspell-mode的琐碎包装;具有这样名称的函数是常见的,但不是正式的约定。函数flyspell-mode-onflyspell-mode-off显然是为了内部使用。

通常情况下,命令从current-prefix-arg变量读取当前前缀参数。不要把它与prefix-arg混为一谈,它是下一个命令的值(只有几个命令,比如universal-argument,可以触摸这个变量)。因此,如果在调用函数时需要传递前缀参数,则绑定或设置current-prefix-arg

代码语言:javascript
复制
(let ((current-prefix-arg t))
  (flyspell-mode))
票数 10
EN

Stack Overflow用户

发布于 2012-02-22 10:50:39

我能想到这个..。应该会更好

代码语言:javascript
复制
(call-interactively (lambda ()
                       (interactive)
                       (flyspell-mode '(4))))

更新:我可以直接运行。我在这个问题上遗漏了什么?

代码语言:javascript
复制
(flyspell-mode '(4))

编辑:删除lambda表达式的引号(我添加了这个注释,因为SX强制编辑至少有6个字符长,因此可以删除)。

票数 3
EN

Stack Overflow用户

发布于 2012-02-23 03:56:01

FWIW,至少从Emacs-21开始,‘Fly拼写模式’函数已经接受了一个参数(如“(Fly拼写-模式1)"),所以我不知道您是如何得到这个错误的。

但是当我在这里的时候,我不妨指出(Ad-钩子的文本模式-钩子的反拼写模式)已经改变了Emacs-24中的意思:不再意味着“在文本模式中切换拼写模式”,而是“在文本模式中启用拼写模式”。这是一个向后兼容的变化,但我相信它将修复比它将要引入的更多潜在的错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9387816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档