我想编写一个Emacs Lisp函数,flyspell-mode无论模式的当前状态如何,它都会打开.函数flyspell-mode-on已弃用.文档表明肯定的前缀参数将转向flyspell-mode,但遗憾的是运行
(flyspell-mode 1)
Run Code Online (Sandbox Code Playgroud)
导致错误消息:
Wrong number of arguments: (lambda (flyspell-mode 1)), 0
Run Code Online (Sandbox Code Playgroud)
如果我能弄清楚如何flyspell-mode用前缀参数调用,我相信我可以解决这个问题.
我在Emacs Lisp手册中可以找到的最相关的部分是标题为"Interactive Call"的部分,它描述了这样的命令call-interactively.这显然不是我想要的.
(我试图解决的最终问题是创建一个模式挂钩,无论当前状态如何,都会打开模式.)
NB问题的标题emacs lisp调用函数与前缀参数以编程方式使它看起来是相关的,但该问题是询问如何创建交互式命令,并且问题最终通过使用来解决call-interactively.
编辑:这个问题没有实际意义; 我找到了原始问题的替代解决方案:
(add-hook 'text-mode-hook
(function (lambda ()
(require 'flyspell)
(if flyspell-mode nil (flyspell-mode)))))
Run Code Online (Sandbox Code Playgroud)
但我仍然想知道如何从另一个Emacs Lisp函数调用带有前缀参数的Emacs Lisp函数,没有任何交互.
更新:也许我应该问为什么我收到错误消息...
看起来您的Flyspell模式版本不遵循次要模式约定,这要求您可以使用(name-of-mode t)或任何正前缀参数打开次要模式,使用(name-of-mode 0)任何否定前缀参数将其关闭,然后将其切换为(name-of-mode nil).
如果你有最新版本的Flyspell,可能会有错误报告.我在我的机器上有GNU Emacs 23.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))
Run Code Online (Sandbox Code Playgroud)
如果您不以交互方式调用函数,则 (interactive)声明不会用于获取参数。
在绝大多数情况下,您无需担心参数是否可以成为非交互式调用的“前缀参数”;只需检查函数文档,并传递您想要执行的任何操作所需的值。
如果由于某种原因确实需要在非交互式上下文中复制发送前缀参数,则需要检查该函数的 (interactive)声明并确定它是如何使用该参数的,并确保为您所做的参数复制该行为经过。
有关完整详细信息,请参阅:
interactive RET(info "(elisp) Prefix Command Arguments") RET在函数根据current-prefix-arg变量改变其行为的更复杂的情况下,您可以直接设置该变量。
(let ((current-prefix-arg '(4)))
(foo current-prefix-arg))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5518 次 |
| 最近记录: |