切换主题时,minibuffer的显示问题

使用cycle-theme这个函数的时候按理说根据这行代码

  (let ((progress-reporter
         (make-progress-reporter
          (format "Loading theme %s..." dalu--current-theme))))
    (load-theme (intern dalu--current-theme) t)
    (progress-reporter-done progress-reporter))

应该是可以在minibuffer显示Loading theme的,但是如图所示一直是显示空白,查看*Message*也确实是输出了这行信息。查看Minibuffer-message-timeout变量,它的值也设为了2,应该不会马上消失。

如果直接C-x C-e上述let代码的话也会在minibuffer显示Loading theme的信息,但是在执行cycle-theme函数的时候minibuffer就是一片空白了。

我现在想的是会不会是更换主题导致界面刷新,所以使得minibuffer信息缺失?

希望懂的人能为我解惑 :joy:

minibuffer 的信息刷掉就没了。

你贴静态图片说明不了问题。

当我执行函数的时候,minibuffer始终是空白的,这也会被刷掉吗?

你把 (load-theme...) 删掉或改成语句试试。

    (load-theme (intern dalu--current-theme) t)

这一行是载入主题的关键句,删掉了就没法载入新主题了啊 :joy:

改成语句的话应该要怎么做?我是elisp小白

让你删掉做测试。

图中显示的 next pre 这一行字不就是显示在 MiniBuffer / Echo Area 处吧?没怎么用过 Hydra,不知道它显示的时候,message 还能不能用。

显示的信息是可以出现在next prev下面那一行minibuffer里的,如果我把贴出来的函数代码改为

(let ((progress-reporter
       (make-progress-reporter 
        (format "Loading theme %s..." dalu--current-theme)
                               0  500)))
  (dotimes (k 500)
    (sit-for 0.01)
    (progress-reporter-update progress-reporter k))
  (load-theme (intern dalu--current-theme) t)
  (progress-reporter-done progress-reporter))

next prev下面的minibuffer是可以看到Loading theme...[进度条]信息的,进度条走完信息立刻就消失了,按理说这条信息是可以保留一段时间的,但不知道是什么原因导致的在我这里会立刻消失 :joy:

这两个同时在用 Echo Area,有冲突、不完全兼容应该并不奇怪。只看你的标题,切换个主题和 message 之间不会有什么问题:

(defun foo ()
  (interactive)
  (let ((theme 'manoj-dark))
    (message "Loading theme %s..." theme)
    (load-theme theme 'no-comfirm)
    (message "Loading theme %s...done" theme)))

make-progress-reportermessage 作用一样。

参考了陈斌大神的配置后,我现在的代码是这样的

(defun dalu//cycle-theme (index)
  "Cycle through a list of themes among `dalu-theme-list'."
  (setq dalu-current-theme-index
        (+ index (cl-position
                  (car (mapcar 'symbol-name dalu-theme-list)) dalu-cycle-themes :test 'equal)))
  (when (>= dalu-current-theme-index (length dalu-cycle-themes))
    (setq dalu-current-theme-index 0))
  (when (< dalu-current-theme-index 0)
    (setq dalu-current-theme-index (- (length dalu-cycle-themes) 1)))
  (let* ((dalu--current-theme (nth dalu-current-theme-index dalu-cycle-themes)))
    (counsel-load-theme-action dalu--current-theme)
    (message "Loading theme %s..." dalu--current-theme)))

这代码在minibuffer所起的作用应该跟您贴出来的是一致的,但实际情况是minibuffer仍然没有任何显示,Loading theme...的信息仍然只出现在*Message*:sweat_smile:

我用make-process-reporter的主要原因是在加载完成后,对于显示在minibuffer的字符串它能自动加上一个done。。。

不过用make-process-reportermessage这两种做法都不起作用,我实在想不出会是哪里的问题了。。。真的是nextprev把minibuffer显示的信息挡住了不成 :joy: 但是给make-process-reporter加上延时后在nextprev的下面是能看到Loading theme...的,切换完成后就瞬间消失了。。。

我本地测试没有问题,直接 message 也行。你可以用 emacs -Q 试试。如果没有问题的话,就是你的配置有冲突。

emacs

counsel-load-theme-action 是什么函数?会产生什么影响?

把代码精简到只有一句 (message ...),然后逐渐添加,看那一句出了问题。

笨方法往往也是有效的方法。

1 个赞

先禁用当前主题,然后载入新主题

原来是这个意思 :joy:,是我没搞懂;按照你说的方法试了后,发现本身的问题不在自己写的函数里,问题出在hydra身上,谢啦!

多谢帮忙测试,按楼下的说法一步步测试后发现问题所在了