减轻 pulse 的渲染压力

pulse 是一个很好玩的东西,可以暂时闪烁一行或者一个区域(我从 centaur emacs 那里学到了一些配置很好用🤣)

然而最近在 27 寸 4K 屏幕上是用的时候,发现 Emacs 全屏时 pulse 非常卡顿,猜测是因为 pulse 是用 CPU 渲染的,屏幕太大了 CPU 跟不上。

看了一下 pulse 的源码,发现是在指定区域上放一个 overlay,然后用一个 timer 来更新 overlay 的颜色,可以直接设置

(setq pulse-delay 0.08
      pulse-iterations 2)

第二个是每次闪烁刷新几轮,第一个是两次刷新之间的时间间隔。模式迭代 10 轮,我觉得没有必要,对我来说 2~4 就已经看不出区别了,因此设置为上面的参数。

7 个赞

我是把pulse-delay的时间调长点,比如老王的color-rg在搜索到结果,选择某个candidate时闪烁太快了,没来得及反应就找不到了。

(setq color-rg-flash-line-delay 20.0)

(defun color-rg-flash-line ()
  (let ((pulse-iterations 1)
        (pulse-delay color-rg-flash-line-delay))
         ...

我也像你这样设了这个值,但不知道为啥,我在调试的时候才能在目标buffer看到闪烁,不调试的时候就看不到了 :sleepy: 我用的是windows,莫非和这个有关?

我的经验,快速跳转或者闪烁之前要加一个 (redsplay t) 的设置,这应该就会画出来。

我用的是macOS,就设置了时间,调长到20秒,我能一眼找到对应的位置。

感谢解答,我找到适用于自己的方案了

感谢猫哥的解答,我在调用前加了你说的这句,的确是能出来了。不过出来的现象却各异。有的是正常闪烁一下,有的是出来后,然后停留20秒。有的是没有闪。后来我在此处加了一句,并且把停留20秒去掉了

这样所有的跳转都能正常的看到闪烁,这就够了。我不需要停20秒,因为这里的场景关键是要知道它跳到哪一行。我以前不知道原来有这个闪烁,之前跳完之后就两眼懵了 :laughing:

pulse 这个本身就不好用,比如我想连续高亮两个地方就无法办到。

还没遇到过这种需求……

好像是 pulse 对于开始和结束的判定有问题,一旦两次操作有重叠就会失效,所以最后我还是靠传统的 highlight。

1 个赞

我一直用默认的参数好像还行啊,不管是4k 2k的屏幕都没遇到楼主的问题

有可能是我的电脑机能的问题 :joy_cat: 发出来记录一下,万一有朋友遇到同样的问题

1 个赞