曾经在另一个帖子发过,现在的代码稍有改动,都可以参考下:
(defun my/update-modeline-box (&rest _)
(unless (minibufferp)
(when (eq (window-buffer (selected-window)) (current-buffer))
(let* ((face (cond
((evil-normal-state-p) 'doom-modeline-evil-normal-state)
((evil-emacs-state-p) 'doom-modeline-evil-emacs-state)
((evil-insert-state-p) 'doom-modeline-evil-insert-state)
((evil-motion-state-p) 'doom-modeline-evil-motion-state)
((evil-visual-state-p) 'doom-modeline-evil-visual-state)
((evil-operator-state-p) 'doom-modeline-evil-operator-state)
((evil-replace-state-p) 'doom-modeline-evil-replace-state)
(t 'doom-modeline-evil-user-state)))
(color (or (face-foreground face nil t) (face-foreground 'default))))
(set-face-attribute 'mode-line-active nil :box `(:line-width (-1 . -2) :color ,color))))))
(define-advice redisplay--pre-redisplay-functions
(:around (orig arg) update-modeline-box)
(funcall orig arg)
(my/update-modeline-box))
(set-face-attribute 'mode-line-inactive nil :box `(:line-width (-1 . -2) :color ,(face-foreground 'vertical-border)))