参考各位前辈的代码做了一些定制:
1、感觉用边框颜色指示 evil 状态更合理(不会影响 modeline 其他信息的背景色)
2、修改了更新边框颜色的 hook,感觉这样更加合理
(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 (face-foreground face nil t)))
(set-face-attribute 'mode-line-active nil :box `(:line-width (-1 . -2) :color ,color))))))
(add-hook 'evil-emacs-state-entry-hook #'my/update-modeline-box)
(add-hook 'evil-insert-state-entry-hook #'my/update-modeline-box)
(add-hook 'evil-motion-state-entry-hook #'my/update-modeline-box)
(add-hook 'evil-normal-state-entry-hook #'my/update-modeline-box)
(add-hook 'evil-visual-state-entry-hook #'my/update-modeline-box)
(add-hook 'evil-replace-state-entry-hook #'my/update-modeline-box)
(add-hook 'evil-operator-state-entry-hook #'my/update-modeline-box)
(add-hook 'window-buffer-change-functions #'my/update-modeline-box)
(add-hook 'window-selection-change-functions #'my/update-modeline-box)
