趁着居家这几天重头配置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))))