【问题标题】:What does it mean when emacs tells me "File mode specification error"?当 emacs 告诉我“文件模式规范错误”时,这是什么意思?
【发布时间】:2016-12-11 14:24:48
【问题描述】:

这是我见过的最无用的错误信息。

我认为它转化为..“错误”。

*消息*缓冲区的完整错误消息是:

File mode specification error: (wrong-type-argument characterp "string value here")

我认为该消息的后半部分意味着 emacs 期待一个字符并得到一个字符串。

但是当 emacs 告诉我“文件模式规范错误”时,我该如何诊断它的含义呢?以及如何缩小此错误的来源?

这两个错误(文件模式错误、期望字符和得到字符串)有什么关系?

【问题讨论】:

  • 更多关于触发错误的条件的上下文会有所帮助
  • 那么,你是通过find-file打开一个文件,在打开文件的最后Emacs报这个错误吗?还是您自己调用正常模式?您尝试打开的文件类型是什么?
  • @vpit3833,我不想打开文件。无论如何都没有明确表示。我正在运行一些 elisp 代码,但是......即使这样也不会打开文件,甚至不会隐式打开。 @Richard,我理解您的要求,但我不是在寻求帮助来诊断 此特定错误。我正在寻找这个非常常见的 emacs 错误消息的解释。它似乎在许多情况下都会弹出,通常(显然)根本与打开文件无关。我在问,为什么会这样?
  • 我看到了你的其他问题。升级到 Emacs 23 后是否出现此错误?升级可能会改变您的 elisp 所期望的某些函数/变量行为。如果该 elisp 是您从网上下载的软件包,可能会有升级。或者,显示在 .emacs 开头添加 (setq debug-on-error t) 时会出现的违规行或堆栈跟踪。 normal-mode 在尝试加载主模式时导致错误。打开文件时会发生这种情况。自己看\Ch-f normal-mode
  • 是的,升级到 emacs23 后出现错误。当我有机会潜入时会发布更新。谢谢。

标签: emacs


【解决方案1】:

当这个(或任何)错误发生时,使用 M-x toggle-debug-on-error RET 进入调试器——假设这是一个正确的错误,而不仅仅是一个信息。这为您提供了堆栈跟踪,因此您可以找出导致它的原因,然后从那里继续(可能使用 edebug,一旦您确定了要检测的函数,但您可以使用常规调试器做很多事情)。

标准调试器命令: M-: (info "(elisp) Debugger Commands") RET

调试 lisp 的主要手册条目(包括 edebug): M-: (info "(elisp) Debugging") RET

仅供参考,rgrep 告诉我 NTEmacs 23.2.1 的 *.el 文件中字符串“文件模式规范错误”的唯一实例出现在 normal-mode 函数定义中:
M-x kbd> find-function RET normal-mode RET

【讨论】:

  • 感谢您的提示,感谢您使用 grep。我会调查normal-mode,看看我是否能理解它。
  • 对我没有帮助。即使我有toggle-debug-on-error,我仍然会在没有调试器启动的情况下收到错误(有时当我尝试使用ido-find-file 打开文件时会发生这种情况,它会创建缓冲区,但如果我切换则不会切换到它手动一切正常)。有什么想法吗?
  • dolzenko:至少在 Emacs 24 中,如果debug-on-errornil,则生成该消息,因此假设您肯定将变量切换为 ON 而不是 OFF ,那么在错误发生之前必须有其他东西禁用debug-on-error
  • 对我来说,这是因为我使用 (foo-mode +1) 而不是 (foo-mode 1) 。感谢toggle-debug-on-error
【解决方案2】:

您可能想说明您使用的 Emacs 版本。

如果是GNU Emacs 23,那么相关代码在files.el中的函数normal-mode中,如下所示:

(report-errors "File mode specification error: %s"
  (set-auto-mode))

所以函数set-auto-mode(或从那里调用的某个函数)发出wrong-type-argument 错误的信号,normal-mode 正在添加文本File mode specification error 以帮助您追踪它,但遗憾的是它没有帮助在这里,因为set-auto-mode的作用是判断一个buffer应该有哪个主模式,然后开启那个模式。我希望是模式本身发出错误信号。

所以 phils 建议打开 debug-on-error 并查看回溯是一个很好的建议:这应该可以让您了解正在发生的事情。

【讨论】:

    【解决方案3】:

    对我来说,这是因为我在编写的函数体周围多了一对() 括号。我猜这会让 lisp 尝试执行函数体的返回值。所以请注意你的括号计数!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多