问题:
最近把windows11更新到了22H2,然后wsl提示有更新(好像是什么变成store版本了),没细看就更新了。
接着emacs 29.0.50 org-mode下的org-latex-preview
就出问题了,之前都是正常的,现在无法生成预览图片了,细看有个错误叫 arithmetic overflow error
,打开debug-on-error
,一路跟下去,最后发现是 (display-mm-height)
变成0了的缘故。看这个方法内部的代码,发现主要是因为(x-display-mm-height)
变成了0,而display-mm-dimensions-alist
是空的列表。
跑到windows下面的emacs看了眼display-mm-height
是正常值(334),且(x-display-mm-height)
也是正常值(334)。
问题锁定
那么问题应该就在(x-display-mm-height)
这个C函数身上了,但是为啥更新wsl之前都正常呢?
临时解决方案
于是根据frame.el.gz
里面的注释:
You can override what the system thinks the result should be by adding an entry to `display-mm-dimensions-alist’.
想了个临时解决办法,往display-mm-dimensions-alist
里面手动添加一个size,
先(frame-parameter nil 'display)
得到"wayland-0"
之后通过(setq display-mm-dimensions-alist '(("wayland-0" . (797 . 344))))
强行写入mm-size
之后display-mm-height
的返回值就正常了,org-latex-preview
也能正常工作了。
更多发现
再往下看,发现wsl下的emacs中display-monitor-attributes-list
这个列表里面的mm-size
变成了全零,而windows下面的则不是。
WSL emacs:
(display-monitor-attributes-list)
(((name . "rdp") (geometry 0 0 3440 1440) (workarea 0 0 3440 1440) (mm-size 0 0) (scale-factor . 1.0) (frames #<frame *scratch* - GNU Emacs at Inspir-xuehy-PC 0x5597d68a64c8>) (source . "Gdk")))
Win emacs:
(display-monitor-attributes-list)
(((geometry 0 0 3440 1440) (workarea 0 0 3440 1380) (mm-size 797 334) (name . "\\\\.\\DISPLAY1") (frames #<frame *scratch* - GNU Emacs at INSPIR-XUEHY-PC 0000025d56b45870>)))
windows里面的mm-size
是797, 334而wsl里面的是0,0.
难道是更新了WSL之后emacs C函数里面获取display的信息出了问题?
大家有没有遇到相同问题的呢?