178 lines
6.5 KiB
EmacsLisp
178 lines
6.5 KiB
EmacsLisp
(require 'evil)
|
||
(require 'magit)
|
||
(require 'all-the-icons)
|
||
|
||
|
||
(defvar powerline-current-window nil)
|
||
(defun update-current-window (windows)
|
||
(when (not (minibuffer-window-active-p (frame-selected-window)))
|
||
(setq powerline-current-window (selected-window))))
|
||
(add-function :before pre-redisplay-function 'update-current-window)
|
||
|
||
|
||
(defun evil-tag-color ()
|
||
(if (eq (get-buffer-window) powerline-current-window)
|
||
(cond ((evil-normal-state-p) "#5c3f56")
|
||
((evil-visual-state-p) "#446963")
|
||
((evil-insert-state-p) "#ac4142")
|
||
((evil-emacs-state-p) "SeaGreen")
|
||
((evil-operator-state-p) "SeaGreen")
|
||
((evil-motion-state-p) "SeaGreen")
|
||
((evil-replace-state-p) "maroon"))
|
||
(face-background 'mode-line-inactive)))
|
||
|
||
(defun branch-tag-bg-color ()
|
||
(if (eq (get-buffer-window) powerline-current-window)
|
||
"gainsboro"
|
||
(face-background 'mode-line-inactive)))
|
||
|
||
(defun branch-tag-fg-color ()
|
||
(if (eq (get-buffer-window) powerline-current-window)
|
||
"#181818"
|
||
(face-foreground 'mode-line-inactive)))
|
||
|
||
(defun time-tag-bg-color ()
|
||
(if (eq (get-buffer-window) powerline-current-window)
|
||
"ivory"
|
||
(face-background 'mode-line-inactive)))
|
||
|
||
(defun time-tag-fg-color ()
|
||
(if (eq (get-buffer-window) powerline-current-window)
|
||
"#181818"
|
||
(face-foreground 'mode-line-inactive)))
|
||
|
||
(defun fancy-mode-line-render (left center right &optional lpad rpad)
|
||
"Return a string the width of the current window with
|
||
LEFT, CENTER, and RIGHT spaced out accordingly, LPAD and RPAD,
|
||
can be used to add a number of spaces to the front and back of the string."
|
||
(condition-case err
|
||
(let* ((left (if lpad (concat (make-string lpad ?\s) left) left))
|
||
(right (if rpad (concat right (make-string rpad ?\s)) right))
|
||
(width (apply '+ (window-width)
|
||
(let ((m (window-margins)))
|
||
(list (or (car m) 0) (or (cdr m) 0)))))
|
||
(total-length (+ (length left) (length center) (length right) 0)))
|
||
(when (> total-length width) (setq left "" right ""))
|
||
(let* ((left-space (/ (- width (length center)) 2))
|
||
(right-space (- width left-space (length center)))
|
||
(lspaces (max (- left-space (length left)) 1))
|
||
(rspaces (max (- right-space (length right)) 0)))
|
||
(concat left (make-string lspaces ?\s)
|
||
center
|
||
(make-string rspaces ?\s)
|
||
right)))
|
||
(error (format "[%s]: (%s) (%s) (%s)" err left center right))))
|
||
|
||
(defun evil-mode-state ()
|
||
(let ((str (cond ((evil-normal-state-p) (format " NORMAL " ))
|
||
((evil-visual-state-p) (format " VISUAL " ))
|
||
((evil-insert-state-p) (format " INSERT " ))
|
||
((evil-emacs-state-p) (format " EMACS " ))
|
||
((evil-operator-state-p) (format " OPERATOR " ))
|
||
((evil-motion-state-p) (format " MOTION " ))
|
||
((evil-replace-state-p) (format " REPLACE " )))))
|
||
(propertize
|
||
str
|
||
'face `(:height 1.0 :background ,(evil-tag-color) :weight bold))))
|
||
|
||
(defun vc-mode-branch-state ()
|
||
(let ((bufname (buffer-file-name (current-buffer))))
|
||
(when bufname
|
||
(when (magit-get-current-branch)
|
||
(propertize
|
||
(format " %s " (magit-get-current-branch))
|
||
'face `(:weight bold
|
||
:foreground ,(branch-tag-fg-color)
|
||
:background ,(branch-tag-bg-color)))))))
|
||
|
||
(defun powerline-modified ()
|
||
(let* ((config-alist
|
||
'(("*" all-the-icons-faicon-family
|
||
all-the-icons-faicon "chain-broken" :height 1.2 :v-adjust -0.0)
|
||
("-" all-the-icons-faicon-family
|
||
all-the-icons-faicon "link" :height 1.2 :v-adjust -0.0)
|
||
("%" all-the-icons-octicon-family
|
||
all-the-icons-octicon "lock" :height 1.2 :v-adjust 0.1)))
|
||
(result (cdr (assoc (format-mode-line "%*") config-alist))))
|
||
(let ((res
|
||
(propertize
|
||
(apply (cadr result) (cddr result))
|
||
'face
|
||
`(:background ,(evil-tag-color) :family ,(funcall (car result))))))
|
||
(propertize
|
||
(format " %s" res)
|
||
'face
|
||
`(:background ,(evil-tag-color) :family ,(funcall (car result)))))))
|
||
|
||
(defun custom-modeline-mode-icon ()
|
||
(let ((icon (all-the-icons-icon-for-buffer)))
|
||
(if (not (symbolp icon)) ;; This implies it's the major mode
|
||
(format " %s"
|
||
(propertize
|
||
(all-the-icons-icon-for-buffer)
|
||
'face
|
||
`(:family ,(all-the-icons-icon-family-for-buffer))
|
||
'display '(raise 0.0)))
|
||
(format " %s"
|
||
(propertize
|
||
""
|
||
'face
|
||
`(:family ,(all-the-icons-faicon-family))
|
||
'display '(raise 0.0))))))
|
||
|
||
(defun line-count-line ()
|
||
(let* ((bg (time-tag-bg-color))
|
||
(fg (time-tag-fg-color)))
|
||
(concat
|
||
(propertize
|
||
(format " %%l/%d "
|
||
(count-lines (point-min) (point-max)))
|
||
'face `(:background ,bg :foreground ,fg)))))
|
||
|
||
(defun powerline-time ()
|
||
(let* ((hour (string-to-number (format-time-string "%I")))
|
||
(bg (time-tag-bg-color))
|
||
(fg (time-tag-fg-color)))
|
||
(concat
|
||
(propertize
|
||
(format-time-string " %H:%M ")
|
||
'face
|
||
`(:height 1.0 :background ,bg :foreground ,fg))
|
||
(propertize
|
||
"·"
|
||
'face `(:height 1.0 :background ,bg :foreground ,fg)))))
|
||
|
||
(defvar separator-left "")
|
||
(defvar separator-right "")
|
||
;; (defvar separator-left
|
||
;; (propertize
|
||
;; ""
|
||
;; 'face `(:height 1.1 :foreground "#86261c") 'display '(raise -0.0)))
|
||
|
||
;; (defvar separator-right
|
||
;; (propertize
|
||
;; " "
|
||
;; 'face `(:height 1.1 :foreground "#86261c") 'display '(raise -0.0)))
|
||
|
||
(setq-default mode-line-format
|
||
(list
|
||
'((:eval (fancy-mode-line-render
|
||
;; left
|
||
(format-mode-line
|
||
(concat
|
||
(powerline-modified)
|
||
(evil-mode-state)
|
||
(vc-mode-branch-state)
|
||
(custom-modeline-mode-icon) ;; %m
|
||
" %b "))
|
||
;;center
|
||
""
|
||
;; right
|
||
(format-mode-line
|
||
(concat
|
||
separator-left
|
||
;; (format-time-string "%H:%M ⁃ ")
|
||
(powerline-time)
|
||
(line-count-line)))
|
||
0 0)))))
|