不应该呀,你都是在Windows上测的吧?试试这个呢?
(defun icon-displayable-p ()
"Return non-nil if icons are displayable."
(and centaur-icon
(display-graphic-p)))
不应该呀,你都是在Windows上测的吧?试试这个呢?
(defun icon-displayable-p ()
"Return non-nil if icons are displayable."
(and centaur-icon
(display-graphic-p)))
一直都是在windows上测试的,试出了最后一个能用的commit,就是把 all-the-icons
改成可选之后就出现了这个问题。doom-modeline-icon-displayable-p
函数一直都是返回nil,照你上面那样把函数中的 (require 'all-the-icons nil t)
删掉后,doom-modeline-icon-displayable-p
确实返回了 t,这个时候也不卡了。
这就很奇怪了,require 会很卡。你再试试这个呢?
(defun icon-displayable-p ()
"Return non-nil if icons are displayable."
(and centaur-icon
(display-graphic-p)
(featurep 'all-the-icons)))
测试了一下这种就不会卡了
理论上不应该啊,用这么多 require 没遇到过卡的情况。我实在也没法重现
我看看有没有其他人报issue吧
require
的确会遇到卡的情况,这也是很多包的一些小hook在emacs长时间使
用后会卡的原因,因为大家都这么觉得,所以在代码局部中嵌入require
作为
延迟功能加载的实现。的确,事实上也不应该卡,因为emacs文档中也没有对
require的performance做任何显示的说明,但是:
C代码中的实现细节:
/* Record the presence of `require' in this file
even if the feature specified is already loaded.
But not more than once in any file,
and not when we aren't loading or reading from a file. */
if (!from_file)
{
Lisp_Object tail = Vcurrent_load_list;
FOR_EACH_TAIL_SAFE (tail)
if (NILP (XCDR (tail)) && STRINGP (XCAR (tail)))
from_file = true;
}
if (from_file)
{
tem = Fcons (Qrequire, feature);
if (NILP (Fmember (tem, Vcurrent_load_list)))
LOADHIST_ATTACH (tem);
}
tem = Fmemq (feature, Vfeatures);
if (NILP (tem))
{
...
}
可以看到每一次的require
都会遍历这个curernt-load-list
,随着所有延迟
加载的包都一个一个加载完毕,这个list就会变长,虽然一次require
的时间
可能微不足道,但是在一些频繁触发的函数中累计的总和就很可怕,比如
mode-line-format
这种需要实时刷新的情况就很可观了。
我观察到这个问题已经很久了,大概刚接触emacs的时候,用ivy和counsel的时
候就遇到了。那时候给abaobao报bug的时候,我记得他当时也是认为这不应该啊,
但是事实上删除了局部的require
后,那个函数就不卡了(我忘记了是哪一个
issue了)。
也因为这个原因,我在自己的配置中给require
加了个不完美的advice(就是
用featurep做前置验证,没有再应用原函数)。这么做是因为,局部引用
require
的包实在是太多了,我不可能每个包去给作者提issue或自己
patch(更新太累),如果有需要的朋友可以参考一下:
;; 这是一个不完美的patch,因为我们无法预测这样做的副作用,而且emacs在
;; 文档中明确说明不推荐对primitive function做任何advice,但是我自己的
;; 配置就将就了,为了不卡。
(defun my/require (orig-func &rest orig-args)
(let ((fp (car orig-args)))
(if (symbolp fp)
(if (memq fp features)
fp
(apply orig-func orig-args))
(apply orig-func orig-args))))
(advice-add 'require :around #'my/require)
很有参考价值,谢谢!我仔细研究下
Update:没有详细调试,但是从代码看确实如此,每次判断feature之前都要遍历一下。从注释上看还是by design的。所以最好的办法是不用于延迟加载。我先fix doom-modeline。你这个patch确实可以通用,不过只能对于个人,不好推广。root cause还是在上游。
doom-mode-line在启动flymake时,flymake的显示有点太靠边了,不开启flymake其他的segment显示就比较正常; 如图:不开启flymake 开启flymake
就差了一点点
话说doom-modeline 在mac上好肥的说不能让它瘦一点吗,好像因为字体大小的原因,高度调太小是没用的
字体大了当然就高了,调小点就行了。另外设置 doom-modeline-height
和 doom-modeline-bar-width
为0,也是一种方案。
我用的就是emacs29.0.50啊,win10上编译的,6月初的版本; 自定义mode-line加空格应该怎么改啊?
29的话升级到最新版本就行了,emacs和doom-modeline都升级。 自定义请参考README。
更新到了 emacs-plus@29 后进入 agenda view 后非常小,图中上方字体是正文大小。其他页面 doom-line 也有稍微有点小。
切换到其他 app 再切换回 emacs 窗口,就会显示如上图,点击聚焦后再次变得很小。
你得提供详细信息,根据这些我相信没人能明白怎么回事
比如哪些信息?这个 agenda view 是我自定义的,另外进入 deft mode 也会如此。
请到Github根据模板报告issue
Emacs 29 引入了 global-text-scale-adjust
函数,它是直接修改 default
face 的高度,所以可以全局生效,希望能够在 doom-modeline 中集成一下。
谢谢告知,有时间我研究下
Update: 这个函数是改变default face的高度,mode-line并没有继承default face。所以你是想集成什么呢?