hydra 提示板因 doom modeline 不正常闪现

案例函数是 +doom/window-nav/body , 使用 n 和 p 切换 buffer .

原生 modeline :

origin

doom modeline :

modeline

之前用 spaceline 貌似也没有这种情况,请问该如何避免?

确实是有闪烁问题。这是为了解决minibuffer 高度问题强制刷新导致的。

如果不刷新某些 minibuffer 高度会不正确,比如 or-todo, org-set-tags-command 等。这应该是 emacs 本身的问题,用这个 workaround 又会有这个副作用。容我想想~~~

更新试试。。。

没有作用,我看到新的提交把注释掉的 advice 又加回来了

本地测试确定是起作用的,你删除重新安装试试。不行就去掉这个 advice 试试。

我注释了 fit-window-to-buffer 加 advice 这行代码,重新build后:

12%20PM

但是闪现依然存在,可是我全局搜了一下,doom-modeline-redisplay 只有在这两行代码上用到。:thinking:

只需要 eval (advice-remove #'fit-window-to-buffer :before #'doom-modeline-redisplay)就行了。

我发现 doom emacs 自己也有 redisplay 的代码,就是剩余的那个 advice :

(defadvice! modeline-recalculate-height-a (&optional _force &rest _ignored)
  "Ensure that window resizing functions take modeline height into account."
  :before '(fit-window-to-buffer resize-temp-buffer-window)
  (unless +modeline--redisplayed-p
    (setq-local +modeline--redisplayed-p t)
    (redisplay t)))

所有这里也得修改

两边都修改后确实没有问题了

我觉得可以在 (redisplay t) 前的判断条件中加一个变量用来强制性取消 redisplay , 比方说:

(defvar doom-modeline--prevent-redisplay-p nil "...")
(defun doom-modeline-redisplay (&rest _)
  "..."
  (when (and mode-line-format (not doom-modeline--size-hacked-p) 
                    (not doom-modeline--prevent-redisplay-p))
    (setq doom-modeline--size-hacked-p t)
    (redisplay t)))

给使用者一个不重显的途径。

然后在 hydra 的 :on-enter:on-exit 中对这个变量操作,保证 hydra 提示板存在时不会 redisplay

这是个通用的 workround,没必要这么操作。目前的条件足够了,如果不介意高度问题直接remove advices就好了。

当前选择的解决方式:

  1. 定义两个开关函数:
;;;###autoload
(defun +modeline-cancel-redisplay ()
  "Prevent doom modeline to redisplay."
  (setq +modeline--redisplayed-p t
        doom-modeline--size-hacked-p t))

;;;###autoload
(defun +modeline-recover-redisplay ()
  "Allow doom modeline to redisplay."
  (setq +modeline--redisplayed-p nil
        doom-modeline--size-hacked-p nil))
  1. 在定义hydra时设置 :body-pre:before-exit :
(defhydra +hydra/window-nav
  (:hint nil
   :body-pre (+modeline-cancel-redisplay)
   :before-exit (+modeline-recover-redisplay))
  "..." ...)

还能更加简化,比方说添加 advice 到 hydra 的某些函数来开关 redisplay ,以防止每次定义都要用上 :body-pre 和 :before-exit 。

你应该给 doom 提 issue。你这个 workaround 太 tricky 了,没必要这么改。

1 个赞