有没有遇到这样的错误信息: Invalid face reference: nil [296 times]

不确定什么情况下会出现, 用一两天就会出现几次, 再minibuf中看不到, 只能再Message中看到, 所以不确定什么时候出现的. 这个该怎么调试?

开启 toggle-debug-on-error

好像不管用

https://emacs.stackexchange.com/questions/19826/how-do-i-debug-an-invalid-face-reference-quote-message

遇到过挺多次 一般是某个face的定义有问题 导致依赖(:inherit)他的face报错

每次都是玄学debug (比如grep “:inherit” 一下主题文件。。)。。。并找不到规律。。同求好的方法。。

可以试试用 fontlock-studio,在出错的 buffer 以步进的方式开启 font-lock 并诊断问题

最好用的办法是让emacs报这个错的时候把face的名字也包含在错误信息里:slight_smile:

关键是不知道是哪个buffer, 什么时候出现也不知道. 而且是很长时间才出现一次

那试试二分法吧,把有问题的包找出来

刚搜索了下 *Messages*也发现了同样的情况

Invalid face reference: nil [96 times]
...
Invalid face reference: nil [158 times]
...
Invalid face reference: nil [218 times]

以前应该也注意到了,可能由于没实际的影响,所以没在意。我不知道它们是哪里来的,不过有个办法可以重现:

  1. emacs -Q
  2. C-x b foo
  3. M-: (insert (propertize "hello world" 'face '(nil)))
  4. C-h e

这时会看到 *Messages* 中的内容:

For information about GNU Emacs and the GNU system, type C-h C-a.
nilInvalid face reference: nil
Invalid face reference: nil [5 times]

可能是某个package有问题, 也可能是emacs自己问题, 关键是如何找到问题,

不清楚确切的方法,你可以试试找出第一次出现 Invalid face reference 时你在干什么。

这个太难了, 难以操作

感觉像是最新版yasnippet的问题, 恢复到老版本yasnippet, 暂时没出现

可能是使用了anonymous face ,又用到条件语句,本来是 face 的地方被返回 nil 了,比如 #():eval,还有上面提到的 propertize。 有个掩耳盗铃的方法不知道可行性如何

(make-face nil)

注:文档并不推荐在代码中使用 make-face

确实,我试过用 after-change-functions 监测 *Messages* 的变动,但没成功,可能是因为这个 Buffer 比较特殊。

我觉得会产生 Invalid face reference: nil 的地方不止一处,我这里用 Helm 的 M-x helm-semantic-or-imenu 有时就会,且用下面的方法可以稳定地重现:

$ wget https://raw.githubusercontent.com/emacs-mirror/emacs/master/lisp/emacs-lisp/avl-tree.el
$ emacs -Q avl-tree.el
;; 装 Helm
M-x helm-semantic-or-imenu string-join

会产生:

Invalid face reference: nil [71 times]

有时间再考虑看看要不要报告个 Bug。

好吧,我遇到的 Invalid face reference: nil 是由 Helm 的一个 Bug 导致的:

此处有机会变成 (propertize x 'face nil)。当然了你那边出问题的原因有可能跟我的不一样。

这个都被你发现了? 我用的是helm老版本(2.3.4), 这几行代码不太一样, 不过加了点log测试发现确实有问题. 这个地方代码不够严谨啊, 先自己修改一下试试

我刚刚提了个 PR,应该解决了我遇到的问题:

里面types的值看了一下, 两个元素, 第一个是类型, 第二个是文档中的symbol名字, 这样的话, 貌似不应该逐个比对类型表, 因为第一个是类型, 后面的不是类型, 只应该检查第一个元素即可, 而它把普通符号也当做类型检查了一遍. 2.3.4版本是这样

我从来没遇到这个 bug,人品爆发?代码是一样的:

~ $ gsed -n 285,289p ~/.emacs.d/elpa-27.0.50/helm-20180305.1056/helm-imenu.el
               (propertize
                x 'face
                (cl-loop for (p . f) in helm-imenu-type-faces
                         when (string-match p x)
                         return f)))

另外说下,你的 PR 改了源代码缩进,作者合并的时候恐怕要抱怨了。