不确定什么情况下会出现, 用一两天就会出现几次, 再minibuf中看不到, 只能再Message中看到, 所以不确定什么时候出现的. 这个该怎么调试?
开启 toggle-debug-on-error
好像不管用
遇到过挺多次 一般是某个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]
以前应该也注意到了,可能由于没实际的影响,所以没在意。我不知道它们是哪里来的,不过有个办法可以重现:
emacs -Q
C-x b foo
M-: (insert (propertize "hello world" 'face '(nil)))
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 改了源代码缩进,作者合并的时候恐怕要抱怨了。