spacemacs/layers/+spacemacs/spacemacs-modeline/local/vim-powerline/vim-powerline-theme.el

177 lines
8.6 KiB
EmacsLisp

;;; powerline-themes.el --- Themes for Powerline
;; Copyright (C) 2012-2013 Donald Ephraim Curtis
;; Copyright (C) 2013 Jason Milkins
;; Copyright (C) 2012 Nicolas Rougier
;; Author: Donald Ephraim Curtis <dcurtis@milkbox.net>
;; URL: http://github.com/milkypostman/powerline/
;; Version: 2.0
;; Keywords: mode-line
;;; Commentary:
;;
;; Themes for Powerline.
;; Included themes: default, center, center-evil, vim, and nano.
;;
;;; Code:
(require 'cl-lib)
(defface powerline-active3 '((t (:background "#afd700"
:foreground "#008700"
:inherit mode-line)))
"Powerline face 3."
:group 'powerline)
(defface powerline-inactive3 '((t (:foreground "grey90" :background "grey30" :inherit mode-line)))
"Powerline face 3."
:group 'powerline)
(defun check-in-list (list elems)
(catch 'tag
(dolist (elem elems)
(if (member elem list)
(throw 'tag elem)))))
;; Get a face for the current input mode and
;; desired feature. Defaults to "powerline-FEATURE-normal"
(defun pl/get-vim-face (face)
"Find whether or not FACE is a valid face,
and if not, try to get the corresponding
'-normal' face "
(let* ((face (replace-regexp-in-string "iedit-insert" "iedit" face))
(split-face-name nil) (concat-face-name nil) ; some variables we'll use later on
(report-wrong-prefix ; Our error reporter. Because we don't want to return nil.
(lambda () (let ((prefix (subseq (or split-face-name (split-string face "-")) 0 2)))
(error "There's no vim face with the prefix: %s"
(mapconcat 'identity prefix "-"))))))
(cond ((facep face) ; If our face is a FACE (even if it's not a powerline face)
(intern face)) ; just intern the string and send it back
;; Otherwise.
;; Are we a list of only three items?
;; Is the first item a string that is 'powerline'?
;; Is the last element not 'normal'? (If it was valid, it would have already passed)
((and (setf split-face-name (split-string face "-"))
(string-equal (cl-first split-face-name) "powerline")
(not (string-equal (cl-third split-face-name) "normal")))
;; If we passed all the tests above, then we try to create a valid
;; powerline-face symbol
(progn
(setf (cl-third split-face-name) "normal")
;; Re-build our string from the split pieces
(setf concat-face-name (mapconcat 'identity split-face-name "-"))
;; And do one final check to make sure it's a face
;; before sending it off
;; (message "Concatenated name: %s" concat-face-name)
(if (facep concat-face-name)
(intern concat-face-name)
(report-wrong-prefix))))
;; Always fallthrough to the error
(t (report-wrong-prefix)))))
(defmacro pl/vim-face (name state)
`(pl/get-vim-face (format "powerline-%s-%s" ,name ,state)))
(require 'vim-colors)
(defun powerline-vimish-theme ()
"Setup the default mode-line."
;; Populate our faces
(mapcar 'eval (powerline--generate-facedefs powerline-vim-colors-alist))
(set-face-attribute 'mode-line-inactive nil
:background (face-background (pl/vim-face "SPLIT" "inactive")) :underline nil
:overline nil :box nil)
(interactive)
(setq-default mode-line-format
'("%e"
(:eval
(let* ((active (powerline-selected-window-active))
(harddiv-left (intern (format "powerline-%s-%s"
(powerline-current-separator)
(car powerline-default-separator-dir))))
(harddiv-right (intern (format "powerline-%s-%s"
(powerline-current-separator)
(cdr powerline-default-separator-dir))))
(softdiv-left (cl-case powerline-default-separator
((utf-8 arrow) "")
((bar nil) "|")
(brace "}")
(t ">")))
(softdiv-right (cl-case powerline-default-separator
((utf-8 arrow) "")
((bar nil) "|")
(brace "{")
(t "<")))
(editor-state (cond ((and active (boundp 'evil-mode) evil-mode)
(symbol-name evil-state))
(active "active")
(t "inactive")))
(state-indicator-face (pl/vim-face "state_indicator" editor-state))
(vc-face (pl/vim-face "branch" editor-state))
(fileinfo-face (pl/vim-face "fileinfo" editor-state))
(split-face (pl/vim-face "SPLIT" editor-state))
(fileformat-face (pl/vim-face "fileformat" editor-state))
(fileencoding-face (pl/vim-face "fileencoding" editor-state))
(filetype-face (pl/vim-face "filetype" editor-state))
(scrollpercent-face (pl/vim-face "scrollpercent" editor-state))
(lineinfo-face (pl/vim-face "lineinfo" editor-state))
(input (split-string (symbol-name buffer-file-coding-system) "-"))
(platform (check-in-list input '("mac" "unix" "dos")))
(encoding (mapconcat 'identity (delete platform input) "-"))
;; Left hand side
(lhs (list
(powerline-raw (format " %s " (upcase editor-state)) state-indicator-face)
(funcall harddiv-left state-indicator-face vc-face)
(when (and (buffer-file-name (current-buffer)) vc-mode)
(concat
(powerline-raw (downcase (format-mode-line '(vc-mode vc-mode))) vc-face 'r)
(powerline-raw softdiv-left vc-face)))
(powerline-buffer-id fileinfo-face 'l)
(powerline-raw "%*" fileinfo-face 'lr)
(powerline-narrow fileinfo-face 'l)
(funcall harddiv-left fileinfo-face split-face)))
;; Right Hand Side
(rhs (list
(powerline-raw global-mode-string split-face 'r)
(funcall harddiv-right split-face fileformat-face)
(concat
(when (not (null platform))
(concat (powerline-raw platform fileformat-face 'r)
(powerline-raw softdiv-right fileformat-face)))
(powerline-raw encoding fileencoding-face 'lr)
(powerline-raw softdiv-right fileencoding-face))
(powerline-major-mode filetype-face 'lr)
(funcall harddiv-right filetype-face scrollpercent-face)
(powerline-raw "%p" scrollpercent-face 'lr)
(funcall harddiv-right scrollpercent-face lineinfo-face)
(powerline-raw "%l" lineinfo-face 'l)
(powerline-raw ":" lineinfo-face 'lr)
(powerline-raw "%c" lineinfo-face 'r))))
(when active
(set-face-attribute 'mode-line nil :underline nil :overline nil :box nil))
(if (and (null powerline-default-separator)
(null (face-attribute 'powerline-SPLIT-normal :overline)))
nil
nil)
(concat (powerline-render lhs)
(powerline-fill split-face (powerline-width rhs))
(powerline-render rhs)))))))
(provide 'vim-powerline-theme)
;;; powerline-themes.el ends here