关于配置mini-modeline和awesome-tray碰到的一些问题

趁着居家这几天重头配置emacs。配置到modeline的时候,尝试过spaceline, doom-modeline 等等modeline。

发现切换theme的时候,总是有些样式看着难受。 比如比较常用的leuven,就是一条蓝色的modeline,切换到light-blue就是一条屎黄色等等。

最关键是觉得modeline有点多余,浪费了mini-buffer的地方。

所以找到mini-modeline和awesome-tray两个插件。但是用的过程中发现一些问题

mini-modeline的最大的一个问题是: 打开vterm插入或者删除的时候,会频闪mini-buffer。

具体原因它刷新是 erase-buffer 然后再写入。代码如下

 ;; write to minibuffer
 (unless (equal modeline-content
                mini-modeline--cache)
   (setq mini-modeline--cache modeline-content)
   ;; 这里擦除buffer
   (erase-buffer)
   (when mini-modeline--cache
     (let ((height-delta (- (cdr mini-modeline--cache)
                            (window-height (minibuffer-window mini-modeline-frame))))
           ;; ; let mini-modeline take control of mini-buffer size
           (resize-mini-windows t))
       (when (or (> height-delta 0)
                 ;; this is to prevent window flashing for consecutive multi-line message
                 (mini-modeline--overduep mini-modeline--last-change-size
                                          mini-modeline-echo-duration))
         (window-resize (minibuffer-window mini-modeline-frame) height-delta)
         (setq mini-modeline--last-change-size (current-time)))
       (insert (car mini-modeline--cache)))))

然后尝试使用awesome-tray。居然不频闪,而且核心代码量非常非常小且清晰

但是有几个小问题:

1、启动报错 Echo Area 0 不存在。具体代码:

;; Create overlays in each echo area buffer
(dolist (buf '(" *Echo Area 0*" " *Echo Area 1*"))

猜测是启动的时候这个buffer还没创建,所以改为

;; Create overlays in each echo area buffer
(dolist (buf `(,(get-buffer-create " *Echo Area 0*") ,(get-buffer-create " *Echo Area 1*")))

或者在after-init之后启动貌似可以。

2、某些时候切换buffer的时候会跳出modeline(一条大红条);使用magit的时候会跳出header-line(一条大红条);切换主题的时候有时候也会卡出modeline。

3、modeline虽然被缩小为0.1,但是上面其实有字,仔细看可以看到细纹。

没找出原因。反正mini-modeline上没发现这两问题。一梭子把它的代码拷了过来。2、3问题一起解决了

(setq-default mode-line-format (when (and mini-modeline-display-gui-line
  										(display-graphic-p))
                                 '(" ")))

;; Do the same thing with opening buffers.
(mapc
 (lambda (buf)
   (with-current-buffer buf
     (when (local-variable-p 'mode-line-format)
  	 (setq mini-modeline--orig-mode-line mode-line-format)
  	 (setq mode-line-format (when (and mini-modeline-display-gui-line
  									   (display-graphic-p))
  							  '(" "))))
     ;;Make the modeline in GUI a thin bar.
     (when (and mini-modeline-display-gui-line
  			  (local-variable-p 'face-remapping-alist)
  			  (display-graphic-p))
  	 (setf (alist-get 'mode-line face-remapping-alist)
  		   'mini-modeline-mode-line
  		   (alist-get 'mode-line-inactive face-remapping-alist)
  		   'mini-modeline-mode-line-inactive))))
 (buffer-list))

接着就是一些调整,显示自己想要看到的信息

添加了 编码格式、换行符、时间秒数。 修改了在打开mini-buffer 输入的时候,只显示时间信息

最后问个问题

awesome-tray 为什么这样写为什么minibuf就不会频闪呢?

(defun awesome-tray-set-text (text)
  ;; ...省略一些代码
  
    ;; 为什么使用Echo Area的overlay后,insert就不会频闪了呢?
	
    (dolist (o awesome-tray-overlays)
      (when (overlay-buffer o)
        (overlay-put o 'after-string awesome-tray-text)))

    ;; Display the text in Minibuf-0
    (with-current-buffer " *Minibuf-0*"
      (delete-region (point-min) (point-max))
      (insert awesome-tray-text))))

直接把这条线关掉,就没这种问题。

嗯。2、3问题用mini-modeline那一段代码都解决了

关掉后没有高亮指示了,就是区分不了buffer 的 active 或 inactive 状态了。

切换主题的姿势不对,应该先disable掉所有加载的主题,再重新加载。如果用ivy/counsel全家桶,可以用counsel-load-theme就没问题。Centaur Emacs中用centuar-load-theme。如果都没用就用这段代码:

(defun my-load-theme (theme)
    (interactive)
    (mapc #'disable-theme custom-enabled-themes)
    (load-theme theme t))

这个确实能解决切换样式的问题。 不过leuven等主题,它的modeline颜色不是我喜欢的,又不想每个不符合的都去配,所以就干脆不用modeline了,还有同时用modeline和tabbar上下分割的时候,两个条太占位置了

mini-modeline 中 erase-buffer 改成

照闪不误!