doom-modeline 2.1.0

不应该呀,你都是在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 没遇到过卡的情况。我实在也没法重现 :joy:

我看看有没有其他人报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)
7 个赞

很有参考价值,谢谢!我仔细研究下 :+1:t2:

Update:没有详细调试,但是从代码看确实如此,每次判断feature之前都要遍历一下。从注释上看还是by design的。所以最好的办法是不用于延迟加载。我先fix doom-modeline。你这个patch确实可以通用,不过只能对于个人,不好推广。root cause还是在上游。

doom-mode-line在启动flymake时,flymake的显示有点太靠边了,不开启flymake其他的segment显示就比较正常; 如图:不开启flymake 20220701_023844 开启flymake 20220701_023949

就差了一点点

1 个赞

话说doom-modeline 在mac上好肥的说不能让它瘦一点吗,好像因为字体大小的原因,高度调太小是没用的

  1. 换字体或者调整大小;
  2. 自定义mode-line,最后加上空格。
  3. 用 Emacs 29,

字体大了当然就高了,调小点就行了。另外设置 doom-modeline-heightdoom-modeline-bar-width 为0,也是一种方案。

我用的就是emacs29.0.50啊,win10上编译的,6月初的版本; 自定义mode-line加空格应该怎么改啊?

29的话升级到最新版本就行了,emacs和doom-modeline都升级。 自定义请参考README。

image

更新到了 emacs-plus@29 后进入 agenda view 后非常小,图中上方字体是正文大小。其他页面 doom-line 也有稍微有点小。

image 切换到其他 app 再切换回 emacs 窗口,就会显示如上图,点击聚焦后再次变得很小。

你得提供详细信息,根据这些我相信没人能明白怎么回事 :joy:

比如哪些信息?这个 agenda view 是我自定义的,另外进入 deft mode 也会如此。

请到Github根据模板报告issue

Emacs 29 引入了 global-text-scale-adjust 函数,它是直接修改 default face 的高度,所以可以全局生效,希望能够在 doom-modeline 中集成一下。

谢谢告知,有时间我研究下

Update: 这个函数是改变default face的高度,mode-line并没有继承default face。所以你是想集成什么呢?