Emacs lua-mode问题: (void-function interactively-called-p)

我正在尝试安装适用于emacs 21.4.1的lua-mode(版本20110428)并遇到问题。在我的.emacs文件中,我有:

(add-to-list 'load-path "~/.emacs.d/lua-mode/")
...
(setq auto-mode-alist (cons '("\\.lua$" . lua-mode) auto-mode-alist))
(autoload 'lua-mode "lua-mode" "Lua editing mode." t)

我使用了这里的安装说明:http://lua-mode.luaforge.net/ 此外,在我的.emacs.d/ dir中,我有包含lua-mode.el的lua-mode/。所有这些文件都有正确的权限。

但是,当我使用emacs打开新文件“test.lua”时,我在scratch缓冲区中得到以下消息:

“文件模式规范错误:(void-function called-interactively-p)”

我正在运行RHEL5。我在网上寻找了很多帮助,但没有找到太多帮助。有人有什么建议吗?我不知道任何LISP(因此很难调试lua-mode.el),除了一些快捷键,我不太了解emacs。

谢谢。

原文链接 https://stackoverflow.com/questions/6845464

点赞
stackoverflow用户776473
stackoverflow用户776473

我也遇到了这个问题。我能够通过更改以下内容来解决它:

(add-to-list 'auto-mode-alist '("\\.lua\\'" . lua-mode))

我不敢说我知道这是为什么会有所不同:我从加载 javascript 模式的某些逻辑推断出来,它使用了类似的语法来描述文件扩展名。

2011-07-27 13:56:49
stackoverflow用户771610
stackoverflow用户771610

我认为 Emacs 21.4 中根本不存在 `called-interactively-p' 函数。

但实际上,我认为你说的是 XEmacs,而不是 GNU Emacs。请注意,这是两个不同的项目。

你应该将 XEmacs 升级到 21.5 beta 版本,或者更好(因人而异),可能使用 GNU Emacs 23。

2011-07-27 16:19:39
stackoverflow用户663439
stackoverflow用户663439

你正在使用一个 Emacs 版本,它没有带有 1 个参数的 "called-interactively-p" 函数的版本(函数的早期版本没有带有参数)。你可以通过将此解决方法(发布在此处:http://paste.lisp.org/display/115598/raw)放入 Emacs 初始文件中来解决此问题:

(condition-case nil (called-interactively-p 'interactive)
  (error
   ; Save reference to called-interactively-p in
   ; inglorion-system-called-interactively-p
   (fset 'inglorion-system-called-interactively-p
         (symbol-function 'called-interactively-p))
   ; Define called-interactively-p so that it discards
   ; its arguments and calls inglorion-system-called-interactively-p
   (fset 'called-interactively-p
         (lambda (&rest args)
           (inglorion-system-called-interactively-p)))))

但是,当我这样做,并尝试使用 Emacs 22 进行测试时,由于某些函数不存在,我还遇到了其他错误,因此如果您想要使用 lua-mode,则可能必须升级 Emacs 版本。

在 Emacs 23 和 24 中,“lua-mode.el”似乎可以使用(我不是 lua 程序员,无法进行适当的测试),以现有的 lua 文件为例,但是当您尝试创建新的 lua 文件时,它会崩溃。实际上,这是“lua-mode.el”代码中的一个错误,当您尝试打开一个新的 lua 文件时会发生此错误(如果您尝试打开现有的 lua 文件则不会发生)。问题是在“lua-unmark-multiline-literals”函数中的第1218行的“remove-text-properties”调用中,它使用的是一个从“1”开始且结束值为“0”的“remove-text-properties”函数(对于新文件,它是“0”因为缓冲器大小为“0”)。您可以通过将第1218行更改为以下方式来解决此问题:

    (remove-text-properties (or begin 1)
                            (or end
                                (if (> (buffer-size) 0)
                                    (buffer-size)
                                  (or begin 1)))
                            '(syntax-table ()))

您应该让“lua-mode.el”的开发者知道此错误,并可能要求支持早期的 Emacs 版本。

2011-07-27 18:08:40
stackoverflow用户944617
stackoverflow用户944617

我碰巧是lua-mode的维护者。当我在网上冲浪时,幸运地发现了你的问题,并且在有人慷慨地提供了called-interactively-p函数的备用实现后,问题得到了解决。

同时,我必须承认,我很清楚在emacs23之前called-interactively的逻辑已经发生了变化,但我没有在有人将其报告为错误之前就想着去修改它。这只是一个优化努力,因为Emacs最近进行了许多内部API更改,预先修复它们根本就不适合我的时间表。

实际上,我的做法是:

  1. 我将在最近的lua-mode中提供called-interactively-p的备用实现,这将成为下一个版本的内容。
  2. 我想鼓励你以问题报告的形式在此处反馈此类故障。我会定期阅读,并且欢迎你的反馈以及自己的改进。

谢谢,immerrr。

2011-09-14 13:14:00