parent
5f443900d7
commit
81fa5f639d
@ -0,0 +1,7 @@
|
||||
(define-package "powerline" "20160702.1931" "Rewrite of Powerline"
|
||||
'((cl-lib "0.2"))
|
||||
:url "http://github.com/milkypostman/powerline/" :keywords
|
||||
'("mode-line"))
|
||||
;; Local Variables:
|
||||
;; no-byte-compile: t
|
||||
;; End:
|
@ -0,0 +1,594 @@
|
||||
;;; powerline-separators.el --- Separators for Powerline
|
||||
|
||||
;; Copyright (C) 2012-2013 Donald Ephraim Curtis
|
||||
;; Copyright (C) 2013 Jason Milkins
|
||||
;; Copyright (C) 2012 Nicolas Rougier
|
||||
|
||||
;;; Commentary:
|
||||
;;
|
||||
;; Separators for Powerline.
|
||||
;; Included separators: alternate, arrow, arrow-fade, bar, box, brace, butt,
|
||||
;; chamfer, contour, curve, rounded, roundstub, slant, wave, zigzag, and nil.
|
||||
;;
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'cl-lib)
|
||||
(require 'color)
|
||||
|
||||
(defun pl/interpolate (color1 color2)
|
||||
"Interpolate between COLOR1 and COLOR2.
|
||||
|
||||
COLOR1 and COLOR2 must be supplied as hex strings with a leading #."
|
||||
(let* ((c1 (color-name-to-rgb color1))
|
||||
(c2 (color-name-to-rgb color2))
|
||||
(red (/ (+ (nth 0 c1) (nth 0 c2)) 2))
|
||||
(green (/ (+ (nth 1 c1) (nth 1 c2)) 2))
|
||||
(blue (/ (+ (nth 2 c1) (nth 2 c2)) 2)))
|
||||
(color-rgb-to-hex red green blue)))
|
||||
|
||||
(defun pl/hex-color (color)
|
||||
"Get the hexadecimal value of COLOR."
|
||||
(when color
|
||||
(apply 'color-rgb-to-hex (color-name-to-rgb color))))
|
||||
|
||||
(defun pl/pattern (lst)
|
||||
"Turn LST into an infinite pattern."
|
||||
(when lst
|
||||
(let ((pattern (cl-copy-list lst)))
|
||||
(setcdr (last pattern) pattern))))
|
||||
|
||||
(defun pl/pattern-to-string (pattern)
|
||||
"Convert a PATTERN into a string that can be used in an XPM."
|
||||
(concat "\"" (mapconcat 'number-to-string pattern "") "\","))
|
||||
|
||||
(defun pl/reverse-pattern (pattern)
|
||||
"Reverse each line in PATTERN."
|
||||
(mapcar 'reverse pattern))
|
||||
|
||||
(defun pl/row-pattern (fill total &optional fade)
|
||||
"Make a list that has FILL 0s out of TOTAL 1s with FADE 2s to the right of the fill."
|
||||
(unless fade
|
||||
(setq fade 0))
|
||||
(let ((fill (min fill total))
|
||||
(fade (min fade (max (- total fill) 0))))
|
||||
(append (make-list fill 0)
|
||||
(make-list fade 2)
|
||||
(make-list (- total fill fade) 1))))
|
||||
|
||||
(defun pl/pattern-bindings-body (patterns height-exp pattern-height-sym
|
||||
second-pattern-height-sym)
|
||||
"Create let-var bindings and a function body from PATTERNS.
|
||||
The `car' and `cdr' parts of the result can be passed to the
|
||||
function `pl/wrap-defun' as its `let-vars' and `body' arguments,
|
||||
respectively. HEIGHT-EXP is an expression calculating the image
|
||||
height and it should contain a free variable `height'.
|
||||
PATTERN-HEIGHT-SYM and SECOND-PATTERN-HEIGHT-SYM are symbols used
|
||||
for let-var binding variables."
|
||||
(let* ((pattern (pl/pattern (mapcar 'pl/pattern-to-string (car patterns))))
|
||||
(header (mapcar 'pl/pattern-to-string (nth 1 patterns)))
|
||||
(footer (mapcar 'pl/pattern-to-string (nth 2 patterns)))
|
||||
(second-pattern (pl/pattern (mapcar 'pl/pattern-to-string (nth 3 patterns))))
|
||||
(center (mapcar 'pl/pattern-to-string (nth 4 patterns)))
|
||||
(reserve (+ (length header) (length footer) (length center))))
|
||||
(when pattern
|
||||
(cons `((,pattern-height-sym (max (- ,height-exp ,reserve) 0))
|
||||
(,second-pattern-height-sym (/ ,pattern-height-sym 2))
|
||||
(,pattern-height-sym ,(if second-pattern `(ceiling ,pattern-height-sym 2) `,pattern-height-sym)))
|
||||
(list (when header `(mapconcat 'identity ',header ""))
|
||||
`(mapconcat 'identity
|
||||
(cl-subseq ',pattern 0 ,pattern-height-sym) "")
|
||||
(when center `(mapconcat 'identity ',center ""))
|
||||
(when second-pattern
|
||||
`(mapconcat 'identity
|
||||
(cl-subseq ',second-pattern
|
||||
0 ,second-pattern-height-sym) ""))
|
||||
(when footer `(mapconcat 'identity ',footer "")))))))
|
||||
|
||||
(defun pl/pattern-defun (name dir width &rest patterns)
|
||||
"Create a powerline function of NAME in DIR with WIDTH for PATTERNS.
|
||||
|
||||
PATTERNS is of the form (PATTERN HEADER FOOTER SECOND-PATTERN CENTER
|
||||
PATTERN-2X HEADER-2X FOOTER-2X SECOND-PATTERN-2X CENTER-2X).
|
||||
PATTERN is required, all other components are optional.
|
||||
The first 5 components are for the standard resolution image.
|
||||
The remaining ones are for the high resolution image where both
|
||||
width and height are doubled. If PATTERN-2X is nil or not given,
|
||||
then the remaining components are ignored and the standard
|
||||
resolution image with magnification and interpolation will be
|
||||
used in high resolution environments
|
||||
|
||||
All generated functions generate the form:
|
||||
HEADER
|
||||
PATTERN ...
|
||||
CENTER
|
||||
SECOND-PATTERN ...
|
||||
FOOTER
|
||||
|
||||
PATTERN and SECOND-PATTERN repeat infinitely to fill the space needed to generate a full height XPM.
|
||||
|
||||
PATTERN, HEADER, FOOTER, SECOND-PATTERN, CENTER are of the form ((COLOR ...) (COLOR ...) ...).
|
||||
|
||||
COLOR can be one of 0, 1, or 2, where 0 is the source color, 1 is the
|
||||
destination color, and 2 is the interpolated color between 0 and 1."
|
||||
(when (eq dir 'right)
|
||||
(setq patterns (mapcar 'pl/reverse-pattern patterns)))
|
||||
(let ((bindings-body (pl/pattern-bindings-body patterns
|
||||
'height
|
||||
'pattern-height
|
||||
'second-pattern-height))
|
||||
(bindings-body-2x (pl/pattern-bindings-body (nthcdr 5 patterns)
|
||||
'(* height 2)
|
||||
'pattern-height-2x
|
||||
'second-pattern-height-2x)))
|
||||
(pl/wrap-defun name dir width
|
||||
(append (car bindings-body) (car bindings-body-2x))
|
||||
(cdr bindings-body) (cdr bindings-body-2x))))
|
||||
|
||||
(defun pl/background-color (face)
|
||||
(face-attribute face
|
||||
(if (face-attribute face :inverse-video nil 'default)
|
||||
:foreground
|
||||
:background)
|
||||
nil
|
||||
'default))
|
||||
|
||||
(defun pl/wrap-defun (name dir width let-vars body &optional body-2x)
|
||||
"Generate a powerline function of NAME in DIR with WIDTH using LET-VARS and BODY."
|
||||
(let* ((src-face (if (eq dir 'left) 'face1 'face2))
|
||||
(dst-face (if (eq dir 'left) 'face2 'face1)))
|
||||
`(defun ,(intern (format "powerline-%s-%s" name (symbol-name dir)))
|
||||
(face1 face2 &optional height)
|
||||
(when window-system
|
||||
(unless height (setq height (pl/separator-height)))
|
||||
(let* ,(append `((color1 (when ,src-face
|
||||
(pl/hex-color (pl/background-color ,src-face))))
|
||||
(color2 (when ,dst-face
|
||||
(pl/hex-color (pl/background-color ,dst-face))))
|
||||
(colori (when (and color1 color2) (pl/interpolate color1 color2)))
|
||||
(color1 (or color1 "None"))
|
||||
(color2 (or color2 "None"))
|
||||
(colori (or colori "None")))
|
||||
let-vars)
|
||||
(apply 'create-image
|
||||
,(append `(concat (format "/* XPM */ static char * %s_%s[] = { \"%s %s 3 1\", \"0 c %s\", \"1 c %s\", \"2 c %s\","
|
||||
,(replace-regexp-in-string "-" "_" name)
|
||||
(symbol-name ',dir)
|
||||
,width
|
||||
height
|
||||
color1
|
||||
color2
|
||||
colori))
|
||||
body
|
||||
'("};"))
|
||||
'xpm t
|
||||
:ascent 'center
|
||||
:face (when (and face1 face2)
|
||||
,dst-face)
|
||||
,(and body-2x
|
||||
`(and (featurep 'mac)
|
||||
(list :data-2x
|
||||
,(append `(concat (format "/* XPM */ static char * %s_%s_2x[] = { \"%s %s 3 1\", \"0 c %s\", \"1 c %s\", \"2 c %s\","
|
||||
,(replace-regexp-in-string "-" "_" name)
|
||||
(symbol-name ',dir)
|
||||
(* ,width 2)
|
||||
(* height 2)
|
||||
color1
|
||||
color2
|
||||
colori))
|
||||
body-2x
|
||||
'("};")))))))))))
|
||||
|
||||
(defmacro pl/alternate (dir)
|
||||
"Generate an alternating pattern XPM function for DIR."
|
||||
(pl/pattern-defun "alternate" dir 4
|
||||
'((2 2 1 1)
|
||||
(0 0 2 2))
|
||||
nil nil nil nil
|
||||
;; 2x
|
||||
'((2 2 2 2 1 1 1 1)
|
||||
(2 2 2 2 1 1 1 1)
|
||||
(0 0 0 0 2 2 2 2)
|
||||
(0 0 0 0 2 2 2 2))))
|
||||
|
||||
(defmacro pl/arrow (dir)
|
||||
"Generate an arrow XPM function for DIR."
|
||||
(let ((row-modifier (if (eq dir 'left) 'identity 'reverse)))
|
||||
(pl/wrap-defun "arrow" dir 'middle-width
|
||||
'((width (1- (/ height 2)))
|
||||
(middle-width (1- (ceiling height 2))))
|
||||
`((cl-loop for i from 0 to width
|
||||
concat (pl/pattern-to-string (,row-modifier (pl/row-pattern i middle-width))))
|
||||
(when (cl-oddp height)
|
||||
(pl/pattern-to-string (make-list middle-width 0)))
|
||||
(cl-loop for i from width downto 0
|
||||
concat (pl/pattern-to-string (,row-modifier (pl/row-pattern i middle-width)))))
|
||||
`((when (cl-evenp height)
|
||||
(pl/pattern-to-string (make-list (* middle-width 2) 1)))
|
||||
(cl-loop for i from 0 to (* middle-width 2)
|
||||
concat (pl/pattern-to-string (,row-modifier (pl/row-pattern i (* middle-width 2)))))
|
||||
(cl-loop for i from (* middle-width 2) downto 0
|
||||
concat (pl/pattern-to-string (,row-modifier (pl/row-pattern i (* middle-width 2)))))
|
||||
(when (cl-evenp height)
|
||||
(pl/pattern-to-string (make-list (* middle-width 2) 1)))))))
|
||||
|
||||
(defmacro pl/arrow-fade (dir)
|
||||
"Generate an arrow-fade XPM function for DIR."
|
||||
(let* ((row-modifier (if (eq dir 'left) 'identity 'reverse)))
|
||||
(pl/wrap-defun "arrow-fade" dir 'middle-width
|
||||
'((width (1- (/ height 2)))
|
||||
(middle-width (1+ (ceiling height 2))))
|
||||
`((cl-loop for i from 0 to width
|
||||
concat (pl/pattern-to-string (,row-modifier (pl/row-pattern i middle-width 2))))
|
||||
(when (cl-oddp height)
|
||||
(pl/pattern-to-string (,row-modifier (pl/row-pattern (1+ width) middle-width 2))))
|
||||
(cl-loop for i from width downto 0
|
||||
concat (pl/pattern-to-string (,row-modifier (pl/row-pattern i middle-width 2)))))
|
||||
`((when (cl-evenp height)
|
||||
(pl/pattern-to-string (,row-modifier (pl/row-pattern 0 (* middle-width 2) (* 2 2)))))
|
||||
(cl-loop for i from 0 to (* (- middle-width 2) 2)
|
||||
concat (pl/pattern-to-string (,row-modifier (pl/row-pattern i (* middle-width 2) (* 2 2)))))
|
||||
(cl-loop for i from (* (- middle-width 2) 2) downto 0
|
||||
concat (pl/pattern-to-string (,row-modifier (pl/row-pattern i (* middle-width 2) (* 2 2)))))
|
||||
(when (cl-evenp height)
|
||||
(pl/pattern-to-string (,row-modifier (pl/row-pattern 0 (* middle-width 2) (* 2 2)))))))))
|
||||
|
||||
(defmacro pl/bar (dir)
|
||||
"Generate a bar XPM function for DIR."
|
||||
(pl/pattern-defun "bar" dir 2
|
||||
'((2 2))))
|
||||
|
||||
(defmacro pl/box (dir)
|
||||
"Generate a box XPM function for DIR."
|
||||
(pl/pattern-defun "box" dir 2
|
||||
'((0 0)
|
||||
(0 0)
|
||||
(1 1)
|
||||
(1 1))
|
||||
nil nil nil nil
|
||||
;; 2x
|
||||
'((0 0 0 0)
|
||||
(0 0 0 0)
|
||||
(0 0 0 0)
|
||||
(0 0 0 0)
|
||||
(1 1 1 1)
|
||||
(1 1 1 1)
|
||||
(1 1 1 1)
|
||||
(1 1 1 1))))
|
||||
|
||||
(defmacro pl/brace (dir)
|
||||
"Generate a brace XPM function for DIR."
|
||||
(pl/pattern-defun "brace" dir 4
|
||||
'((0 1 1 1))
|
||||
'((1 1 1 1)
|
||||
(2 1 1 1))
|
||||
'((2 1 1 1)
|
||||
(1 1 1 1))
|
||||
'((0 1 1 1))
|
||||
'((0 2 1 1)
|
||||
(0 2 1 1)
|
||||
(0 0 2 1)
|
||||
(0 0 0 0)
|
||||
(0 0 2 1)
|
||||
(0 2 1 1)
|
||||
(0 2 1 1))
|
||||
;; 2x
|
||||
'((0 0 1 1 1 1 1 1))
|
||||
'((1 1 1 1 1 1 1 1)
|
||||
(1 1 1 1 1 1 1 1)
|
||||
(2 1 1 1 1 1 1 1)
|
||||
(0 2 1 1 1 1 1 1))
|
||||
'((0 2 1 1 1 1 1 1)
|
||||
(2 1 1 1 1 1 1 1)
|
||||
(1 1 1 1 1 1 1 1)
|
||||
(1 1 1 1 1 1 1 1))
|
||||
'((0 0 1 1 1 1 1 1))
|
||||
'((0 0 2 1 1 1 1 1)
|
||||
(0 0 0 1 1 1 1 1)
|
||||
(0 0 0 2 1 1 1 1)
|
||||
(0 0 0 0 1 1 1 1)
|
||||
(0 0 0 0 2 1 1 1)
|
||||
(0 0 0 0 0 2 1 1)
|
||||
(0 0 0 0 0 0 0 2)
|
||||
(0 0 0 0 0 0 0 2)
|
||||
(0 0 0 0 0 2 1 1)
|
||||
(0 0 0 0 2 1 1 1)
|
||||
(0 0 0 0 1 1 1 1)
|
||||
(0 0 0 2 1 1 1 1)
|
||||
(0 0 0 1 1 1 1 1)
|
||||
(0 0 2 1 1 1 1 1))))
|
||||
|
||||
(defmacro pl/butt (dir)
|
||||
"Generate a butt XPM function for DIR."
|
||||
(pl/pattern-defun "butt" dir 3
|
||||
'((0 0 0))
|
||||
'((1 1 1)
|
||||
(0 1 1)
|
||||
(0 0 1))
|
||||
'((0 0 1)
|
||||
(0 1 1)
|
||||
(1 1 1))
|
||||
nil nil
|
||||
;; 2x
|
||||
'((0 0 0 0 0 0))
|
||||
'((1 1 1 1 1 1)
|
||||
(0 1 1 1 1 1)
|
||||
(0 0 1 1 1 1)
|
||||
(0 0 0 1 1 1)
|
||||
(0 0 0 0 1 1)
|
||||
(0 0 0 0 0 1))
|
||||
'((0 0 0 0 0 1)
|
||||
(0 0 0 0 1 1)
|
||||
(0 0 0 1 1 1)
|
||||
(0 0 1 1 1 1)
|
||||
(0 1 1 1 1 1)
|
||||
(1 1 1 1 1 1))))
|
||||
|
||||
(defmacro pl/chamfer (dir)
|
||||
"Generate a chamfer XPM function for DIR."
|
||||
(pl/pattern-defun "chamfer" dir 3
|
||||
'((0 0 0))
|
||||
'((1 1 1)
|
||||
(0 1 1)
|
||||
(0 0 1))
|
||||
nil nil nil
|
||||
;; 2x
|
||||
'((0 0 0 0 0 0))
|
||||
'((1 1 1 1 1 1)
|
||||
(0 1 1 1 1 1)
|
||||
(0 0 1 1 1 1)
|
||||
(0 0 0 1 1 1)
|
||||
(0 0 0 0 1 1)
|
||||
(0 0 0 0 0 1))))
|
||||
|
||||
(defmacro pl/contour (dir)
|
||||
"Generate a contour XPM function for DIR."
|
||||
(pl/pattern-defun "contour" dir 10
|
||||
'((0 0 0 0 0 1 1 1 1 1))
|
||||
'((1 1 1 1 1 1 1 1 1 1)
|
||||
(0 2 1 1 1 1 1 1 1 1)
|
||||
(0 0 2 1 1 1 1 1 1 1)
|
||||
(0 0 0 2 1 1 1 1 1 1)
|
||||
(0 0 0 0 1 1 1 1 1 1)
|
||||
(0 0 0 0 2 1 1 1 1 1))
|
||||
'((0 0 0 0 0 2 1 1 1 1)
|
||||
(0 0 0 0 0 0 1 1 1 1)
|
||||
(0 0 0 0 0 0 2 1 1 1)
|
||||
(0 0 0 0 0 0 0 2 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0))
|
||||
nil nil
|
||||
;; 2x
|
||||
'((0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1))
|
||||
'((1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 2 1 1 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 2 1 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1))
|
||||
'((0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)
|
||||
(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0))))
|
||||
|
||||
(defmacro pl/curve (dir)
|
||||
"Generate a curve XPM function for DIR."
|
||||
(pl/pattern-defun "curve" dir 4
|
||||
'((0 0 0 0))
|
||||
'((1 1 1 1)
|
||||
(2 1 1 1)
|
||||
(0 0 1 1)
|
||||
(0 0 2 1)
|
||||
(0 0 0 1)
|
||||
(0 0 0 2))
|
||||
'((0 0 0 2)
|
||||
(0 0 0 1)
|
||||
(0 0 2 1)
|
||||
(0 0 1 1)
|
||||
(2 1 1 1)
|
||||
(1 1 1 1))
|
||||
nil nil
|
||||
;; 2x
|
||||
'((0 0 0 0 0 0 0 0))
|
||||
'((1 1 1 1 1 1 1 1)
|
||||
(1 1 1 1 1 1 1 1)
|
||||
(1 1 1 1 1 1 1 1)
|
||||
(0 0 1 1 1 1 1 1)
|
||||
(0 0 0 2 1 1 1 1)
|
||||
(0 0 0 0 2 1 1 1)
|
||||
(0 0 0 0 0 2 1 1)
|
||||
(0 0 0 0 0 0 1 1)
|
||||
(0 0 0 0 0 0 1 1)
|
||||
(0 0 0 0 0 0 0 1)
|
||||
(0 0 0 0 0 0 0 1)
|
||||
(0 0 0 0 0 0 0 1))
|
||||
'((0 0 0 0 0 0 0 1)
|
||||
(0 0 0 0 0 0 0 1)
|
||||
(0 0 0 0 0 0 0 1)
|
||||
(0 0 0 0 0 0 1 1)
|
||||
(0 0 0 0 0 0 1 1)
|
||||
(0 0 0 0 0 2 1 1)
|
||||
(0 0 0 0 2 1 1 1)
|
||||
(0 0 0 2 1 1 1 1)
|
||||
(0 0 1 1 1 1 1 1)
|
||||
(1 1 1 1 1 1 1 1)
|
||||
(1 1 1 1 1 1 1 1)
|
||||
(1 1 1 1 1 1 1 1))))
|
||||
|
||||
(defmacro pl/rounded (dir)
|
||||
"Generate a rounded XPM function for DIR."
|
||||
(pl/pattern-defun "rounded" dir 6
|
||||
'((0 0 0 0 0 0))
|
||||
'((2 1 1 1 1 1)
|
||||
(0 0 2 1 1 1)
|
||||
(0 0 0 0 1 1)
|
||||
(0 0 0 0 2 1)
|
||||
(0 0 0 0 0 1)
|
||||
(0 0 0 0 0 2))
|
||||
nil nil nil
|
||||
;; 2x
|
||||
'((0 0 0 0 0 0 0 0 0 0 0 0))
|
||||
'((1 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 2 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 2 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 2 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 0 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 0 1))))
|
||||
|
||||
(defmacro pl/roundstub (dir)
|
||||
"Generate a roundstub XPM function for DIR."
|
||||
(pl/pattern-defun "roundstub" dir 3
|
||||
'((0 0 0))
|
||||
'((1 1 1)
|
||||
(0 0 1)
|
||||
(0 0 2))
|
||||
'((0 0 2)
|
||||
(0 0 1)
|
||||
(1 1 1))
|
||||
nil nil
|
||||
;; 2x
|
||||
'((0 0 0 0 0 0))
|
||||
'((1 1 1 1 1 1)
|
||||
(2 1 1 1 1 1)
|
||||
(0 0 0 2 1 1)
|
||||
(0 0 0 0 1 1)
|
||||
(0 0 0 0 0 1)
|
||||
(0 0 0 0 0 1))
|
||||
'((0 0 0 0 0 1)
|
||||
(0 0 0 0 0 1)
|
||||
(0 0 0 0 1 1)
|
||||
(0 0 0 2 1 1)
|
||||
(2 1 1 1 1 1)
|
||||
(1 1 1 1 1 1))))
|
||||
|
||||
(defmacro pl/slant (dir)
|
||||
"Generate a slant XPM function for DIR."
|
||||
(let* ((row-modifier (if (eq dir 'left) 'identity 'reverse)))
|
||||
(pl/wrap-defun "slant" dir 'width
|
||||
'((width (1- (ceiling height 2))))
|
||||
`((cl-loop for i from 0 to (1- height)
|
||||
concat (pl/pattern-to-string (,row-modifier (pl/row-pattern (/ i 2) width)))))
|
||||
`((cl-loop for i from 0 to (1- (* height 2))
|
||||
concat (pl/pattern-to-string (,row-modifier (pl/row-pattern (/ i 2) (* width 2)))))))))
|
||||
|
||||
(defmacro pl/wave (dir)
|
||||
"Generate a wave XPM function for DIR."
|
||||
(pl/pattern-defun "wave" dir 11
|
||||
'((0 0 0 0 0 0 1 1 1 1 1))
|
||||
'((2 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 2 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 2 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 2 1 1 1 1 1))
|
||||
'((0 0 0 0 0 0 2 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 2 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 2 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 2))
|
||||
nil nil
|
||||
;; 2x
|
||||
'((0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1))
|
||||
'((1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1))
|
||||
'((0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1)
|
||||
(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0))))
|
||||
|
||||
(defmacro pl/zigzag (dir)
|
||||
"Generate a zigzag pattern XPM function for DIR."
|
||||
(pl/pattern-defun "zigzag" dir 3
|
||||
'((1 1 1)
|
||||
(0 1 1)
|
||||
(0 0 1)
|
||||
(0 0 0)
|
||||
(0 0 1)
|
||||
(0 1 1))
|
||||
nil nil nil nil
|
||||
;; 2x
|
||||
'((1 1 1 1 1 1)
|
||||
(0 1 1 1 1 1)
|
||||
(0 0 1 1 1 1)
|
||||
(0 0 0 1 1 1)
|
||||
(0 0 0 0 1 1)
|
||||
(0 0 0 0 0 1)
|
||||
(0 0 0 0 0 0)
|
||||
(0 0 0 0 0 1)
|
||||
(0 0 0 0 1 1)
|
||||
(0 0 0 1 1 1)
|
||||
(0 0 1 1 1 1)
|
||||
(0 1 1 1 1 1))))
|
||||
|
||||
(defmacro pl/nil (dir)
|
||||
"Generate a XPM function that returns nil for DIR."
|
||||
`(defun ,(intern (format "powerline-nil-%s" (symbol-name dir)))
|
||||
(face1 face2 &optional height)
|
||||
nil))
|
||||
|
||||
(defmacro pl/utf-8 (dir)
|
||||
"Generate function that returns raw utf-8 symbols."
|
||||
(let ((dir-name (symbol-name dir))
|
||||
(src-face (if (eq dir 'left) 'face1 'face2))
|
||||
(dst-face (if (eq dir 'left) 'face2 'face1)))
|
||||
`(defun ,(intern (format "powerline-utf-8-%s" dir-name))
|
||||
(face1 face2 &optional height)
|
||||
(powerline-raw
|
||||
(char-to-string ,(intern (format "powerline-utf-8-separator-%s"
|
||||
dir-name)))
|
||||
(list :foreground (pl/background-color ,src-face)
|
||||
:background (pl/background-color ,dst-face)
|
||||
:inverse-video nil)))))
|
||||
|
||||
|
||||
(provide 'powerline-separators)
|
||||
|
||||
;;; powerline-separators.el ends here
|
@ -0,0 +1,267 @@
|
||||
;;; powerline-themes.el --- Themes for Powerline
|
||||
|
||||
;; Copyright (C) 2012-2013 Donald Ephraim Curtis
|
||||
;; Copyright (C) 2013 Jason Milkins
|
||||
;; Copyright (C) 2012 Nicolas Rougier
|
||||
|
||||
;;; Commentary:
|
||||
;;
|
||||
;; Themes for Powerline.
|
||||
;; Included themes: default, center, center-evil, vim, and nano.
|
||||
;;
|
||||
|
||||
;;; Code:
|
||||
|
||||
(defcustom powerline-display-buffer-size t
|
||||
"When non-nil, display the buffer size."
|
||||
:group 'powerline
|
||||
:type 'boolean)
|
||||
|
||||
(defcustom powerline-display-mule-info t
|
||||
"When non-nil, display the mule info."
|
||||
:group 'powerline
|
||||
:type 'boolean)
|
||||
|
||||
(defcustom powerline-display-hud t
|
||||
"When non-nil, display the hud."
|
||||
:group 'powerline
|
||||
:type 'boolean)
|
||||
|
||||
;;;###autoload
|
||||
(defun powerline-default-theme ()
|
||||
"Setup the default mode-line."
|
||||
(interactive)
|
||||
(setq-default mode-line-format
|
||||
'("%e"
|
||||
(:eval
|
||||
(let* ((active (powerline-selected-window-active))
|
||||
(mode-line-buffer-id (if active 'mode-line-buffer-id 'mode-line-buffer-id-inactive))
|
||||
(mode-line (if active 'mode-line 'mode-line-inactive))
|
||||
(face1 (if active 'powerline-active1 'powerline-inactive1))
|
||||
(face2 (if active 'powerline-active2 'powerline-inactive2))
|
||||
(separator-left (intern (format "powerline-%s-%s"
|
||||
(powerline-current-separator)
|
||||
(car powerline-default-separator-dir))))
|
||||
(separator-right (intern (format "powerline-%s-%s"
|
||||
(powerline-current-separator)
|
||||
(cdr powerline-default-separator-dir))))
|
||||
(lhs (list (powerline-raw "%*" mode-line 'l)
|
||||
(when powerline-display-buffer-size
|
||||
(powerline-buffer-size mode-line 'l))
|
||||
(when powerline-display-mule-info
|
||||
(powerline-raw mode-line-mule-info mode-line 'l))
|
||||
(powerline-buffer-id mode-line-buffer-id 'l)
|
||||
(when (and (boundp 'which-func-mode) which-func-mode)
|
||||
(powerline-raw which-func-format nil 'l))
|
||||
(powerline-raw " ")
|
||||
(funcall separator-left mode-line face1)
|
||||
(when (and (boundp 'erc-track-minor-mode) erc-track-minor-mode)
|
||||
(powerline-raw erc-modified-channels-object face1 'l))
|
||||
(powerline-major-mode face1 'l)
|
||||
(powerline-process face1)
|
||||
(powerline-minor-modes face1 'l)
|
||||
(powerline-narrow face1 'l)
|
||||
(powerline-raw " " face1)
|
||||
(funcall separator-left face1 face2)
|
||||
(powerline-vc face2 'r)
|
||||
(when (bound-and-true-p nyan-mode)
|
||||
(powerline-raw (list (nyan-create)) face2 'l))))
|
||||
(rhs (list (powerline-raw global-mode-string face2 'r)
|
||||
(funcall separator-right face2 face1)
|
||||
(unless window-system
|
||||
(powerline-raw (char-to-string #xe0a1) face1 'l))
|
||||
(powerline-raw "%4l" face1 'l)
|
||||
(powerline-raw ":" face1 'l)
|
||||
(powerline-raw "%3c" face1 'r)
|
||||
(funcall separator-right face1 mode-line)
|
||||
(powerline-raw " ")
|
||||
(powerline-raw "%6p" mode-line 'r)
|
||||
(when powerline-display-hud
|
||||
(powerline-hud face2 face1)))))
|
||||
(concat (powerline-render lhs)
|
||||
(powerline-fill face2 (powerline-width rhs))
|
||||
(powerline-render rhs)))))))
|
||||
|
||||
;;;###autoload
|
||||
(defun powerline-center-theme ()
|
||||
"Setup a mode-line with major and minor modes centered."
|
||||
(interactive)
|
||||
(setq-default mode-line-format
|
||||
'("%e"
|
||||
(:eval
|
||||
(let* ((active (powerline-selected-window-active))
|
||||
(mode-line-buffer-id (if active 'mode-line-buffer-id 'mode-line-buffer-id-inactive))
|
||||
(mode-line (if active 'mode-line 'mode-line-inactive))
|
||||
(face1 (if active 'powerline-active1 'powerline-inactive1))
|
||||
(face2 (if active 'powerline-active2 'powerline-inactive2))
|
||||
(separator-left (intern (format "powerline-%s-%s"
|
||||
(powerline-current-separator)
|
||||
(car powerline-default-separator-dir))))
|
||||
(separator-right (intern (format "powerline-%s-%s"
|
||||
(powerline-current-separator)
|
||||
(cdr powerline-default-separator-dir))))
|
||||
(lhs (list (powerline-raw "%*" mode-line 'l)
|
||||
(powerline-buffer-size mode-line 'l)
|
||||
(powerline-buffer-id mode-line-buffer-id 'l)
|
||||
(powerline-raw " ")
|
||||
(funcall separator-left mode-line face1)
|
||||
(powerline-narrow face1 'l)
|
||||
(powerline-vc face1)))
|
||||
(rhs (list (powerline-raw global-mode-string face1 'r)
|
||||
(powerline-raw "%4l" face1 'r)
|
||||
(powerline-raw ":" face1)
|
||||
(powerline-raw "%3c" face1 'r)
|
||||
(funcall separator-right face1 mode-line)
|
||||
(powerline-raw " ")
|
||||
(powerline-raw "%6p" mode-line 'r)
|
||||
(powerline-hud face2 face1)))
|
||||
(center (list (powerline-raw " " face1)
|
||||
(funcall separator-left face1 face2)
|
||||
(when (and (boundp 'erc-track-minor-mode) erc-track-minor-mode)
|
||||
(powerline-raw erc-modified-channels-object face2 'l))
|
||||
(powerline-major-mode face2 'l)
|
||||
(powerline-process face2)
|
||||
(powerline-raw " :" face2)
|
||||
(powerline-minor-modes face2 'l)
|
||||
(powerline-raw " " face2)
|
||||
(funcall separator-right face2 face1))))
|
||||
(concat (powerline-render lhs)
|
||||
(powerline-fill-center face1 (/ (powerline-width center) 2.0))
|
||||
(powerline-render center)
|
||||
(powerline-fill face1 (powerline-width rhs))
|
||||
(powerline-render rhs)))))))
|
||||
|
||||
(defun powerline-center-evil-theme ()
|
||||
"Setup a mode-line with major, evil, and minor modes centered."
|
||||
(interactive)
|
||||
(setq-default mode-line-format
|
||||
'("%e"
|
||||
(:eval
|
||||
(let* ((active (powerline-selected-window-active))
|
||||
(mode-line-buffer-id (if active 'mode-line-buffer-id 'mode-line-buffer-id-inactive))
|
||||
(mode-line (if active 'mode-line 'mode-line-inactive))
|
||||
(face1 (if active 'powerline-active1 'powerline-inactive1))
|
||||
(face2 (if active 'powerline-active2 'powerline-inactive2))
|
||||
(separator-left (intern (format "powerline-%s-%s"
|
||||
(powerline-current-separator)
|
||||
(car powerline-default-separator-dir))))
|
||||
(separator-right (intern (format "powerline-%s-%s"
|
||||
(powerline-current-separator)
|
||||
(cdr powerline-default-separator-dir))))
|
||||
(lhs (list (powerline-raw "%*" mode-line 'l)
|
||||
(powerline-buffer-size mode-line 'l)
|
||||
(powerline-buffer-id mode-line-buffer-id 'l)
|
||||
(powerline-raw " ")
|
||||
(funcall separator-left mode-line face1)
|
||||
(powerline-narrow face1 'l)
|
||||
(powerline-vc face1)))
|
||||
(rhs (list (powerline-raw global-mode-string face1 'r)
|
||||
(powerline-raw "%4l" face1 'r)
|
||||
(powerline-raw ":" face1)
|
||||
(powerline-raw "%3c" face1 'r)
|
||||
(funcall separator-right face1 mode-line)
|
||||
(powerline-raw " ")
|
||||
(powerline-raw "%6p" mode-line 'r)
|
||||
(powerline-hud face2 face1)))
|
||||
(center (append (list (powerline-raw " " face1)
|
||||
(funcall separator-left face1 face2)
|
||||
(when (and (boundp 'erc-track-minor-mode) erc-track-minor-mode)
|
||||
(powerline-raw erc-modified-channels-object face2 'l))
|
||||
(powerline-major-mode face2 'l)
|
||||
(powerline-process face2)
|
||||
(powerline-raw " " face2))
|
||||
(if (split-string (format-mode-line minor-mode-alist))
|
||||
(append (if evil-mode
|
||||
(list (funcall separator-right face2 face1)
|
||||
(powerline-raw evil-mode-line-tag face1 'l)
|
||||
(powerline-raw " " face1)
|
||||
(funcall separator-left face1 face2)))
|
||||
(list (powerline-minor-modes face2 'l)
|
||||
(powerline-raw " " face2)
|
||||
(funcall separator-right face2 face1)))
|
||||
(list (powerline-raw evil-mode-line-tag face2)
|
||||
(funcall separator-right face2 face1))))))
|
||||
(concat (powerline-render lhs)
|
||||
(powerline-fill-center face1 (/ (powerline-width center) 2.0))
|
||||
(powerline-render center)
|
||||
(powerline-fill face1 (powerline-width rhs))
|
||||
(powerline-render rhs)))))))
|
||||
|
||||
;;;###autoload
|
||||
(defun powerline-vim-theme ()
|
||||
"Setup a Vim-like mode-line."
|
||||
(interactive)
|
||||
(setq-default mode-line-format
|
||||
'("%e"
|
||||
(:eval
|
||||
(let* ((active (powerline-selected-window-active))
|
||||
(mode-line (if active 'mode-line 'mode-line-inactive))
|
||||
(face1 (if active 'powerline-active1 'powerline-inactive1))
|
||||
(face2 (if active 'powerline-active2 'powerline-inactive2))
|
||||
(separator-left (intern (format "powerline-%s-%s"
|
||||
(powerline-current-separator)
|
||||
(car powerline-default-separator-dir))))
|
||||
(separator-right (intern (format "powerline-%s-%s"
|
||||
(powerline-current-separator)
|
||||
(cdr powerline-default-separator-dir))))
|
||||
(lhs (list (powerline-buffer-id `(mode-line-buffer-id ,mode-line) 'l)
|
||||
(powerline-raw "[" mode-line 'l)
|
||||
(powerline-major-mode mode-line)
|
||||
(powerline-process mode-line)
|
||||
(powerline-raw "]" mode-line)
|
||||
(when (buffer-modified-p)
|
||||
(powerline-raw "[+]" mode-line))
|
||||
(when buffer-read-only
|
||||
(powerline-raw "[RO]" mode-line))
|
||||
(powerline-raw "[%z]" mode-line)
|
||||
;; (powerline-raw (concat "[" (mode-line-eol-desc) "]") mode-line)
|
||||
(when (and (boundp 'which-func-mode) which-func-mode)
|
||||
(powerline-raw which-func-format nil 'l))
|
||||
(when (and (boundp 'erc-track-minor-mode) erc-track-minor-mode)
|
||||
(powerline-raw erc-modified-channels-object face1 'l))
|
||||
(powerline-raw "[" mode-line 'l)
|
||||
(powerline-minor-modes mode-line)
|
||||
(powerline-raw "%n" mode-line)
|
||||
(powerline-raw "]" mode-line)
|
||||
(when (and vc-mode buffer-file-name)
|
||||
(let ((backend (vc-backend buffer-file-name)))
|
||||
(when backend
|
||||
(concat (powerline-raw "[" mode-line 'l)
|
||||
(powerline-raw (format "%s / %s" backend (vc-working-revision buffer-file-name backend)))
|
||||
(powerline-raw "]" mode-line)))))))
|
||||
(rhs (list (powerline-raw '(10 "%i"))
|
||||
(powerline-raw global-mode-string mode-line 'r)
|
||||
(powerline-raw "%l," mode-line 'l)
|
||||
(powerline-raw (format-mode-line '(10 "%c")))
|
||||
(powerline-raw (replace-regexp-in-string "%" "%%" (format-mode-line '(-3 "%p"))) mode-line 'r))))
|
||||
(concat (powerline-render lhs)
|
||||
(powerline-fill mode-line (powerline-width rhs))
|
||||
(powerline-render rhs)))))))
|
||||
|
||||
;;;###autoload
|
||||
(defun powerline-nano-theme ()
|
||||
"Setup a nano-like mode-line."
|
||||
(interactive)
|
||||
(setq-default mode-line-format
|
||||
'("%e"
|
||||
(:eval
|
||||
(let* ((active (powerline-selected-window-active))
|
||||
(lhs (list (powerline-raw (concat "GNU Emacs "
|
||||
(number-to-string
|
||||
emacs-major-version)
|
||||
"."
|
||||
(number-to-string
|
||||
emacs-minor-version))
|
||||
nil 'l)))
|
||||
(rhs (list (if (buffer-modified-p) (powerline-raw "Modified" nil 'r))))
|
||||
(center (list (powerline-raw "%b" nil))))
|
||||
(concat (powerline-render lhs)
|
||||
(powerline-fill-center nil (/ (powerline-width center) 2.0))
|
||||
(powerline-render center)
|
||||
(powerline-fill nil (powerline-width rhs))
|
||||
(powerline-render rhs)))))))
|
||||
|
||||
|
||||
(provide 'powerline-themes)
|
||||
|
||||
;;; powerline-themes.el ends here
|
@ -0,0 +1,582 @@
|
||||
;;; powerline.el --- Rewrite of 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.4
|
||||
;; Keywords: mode-line
|
||||
;; Package-Requires: ((cl-lib "0.2"))
|
||||
|
||||
;;; Commentary:
|
||||
;;
|
||||
;; Powerline is a library for customizing the mode-line that is based on the Vim
|
||||
;; Powerline. A collection of predefined themes comes with the package.
|
||||
;;
|
||||
|
||||
;;; Code:
|
||||
|
||||
(eval-and-compile (require 'powerline-themes))
|
||||
(eval-and-compile (require 'powerline-separators))
|
||||
|
||||
(require 'cl-lib)
|
||||
|
||||
(defface powerline-active1 '((t (:background "grey22" :inherit mode-line)))
|
||||
"Powerline face 1."
|
||||
:group 'powerline)
|
||||
|
||||
(defface powerline-active2 '((t (:background "grey40" :inherit mode-line)))
|
||||
"Powerline face 2."
|
||||
:group 'powerline)
|
||||
|
||||
(defface powerline-inactive1
|
||||
'((t (:background "grey11" :inherit mode-line-inactive)))
|
||||
"Powerline face 1."
|
||||
:group 'powerline)
|
||||
|
||||
(defface powerline-inactive2
|
||||
'((t (:background "grey20" :inherit mode-line-inactive)))
|
||||
"Powerline face 2."
|
||||
:group 'powerline)
|
||||
|
||||
(defface mode-line-buffer-id-inactive
|
||||
'((t (:inherit mode-line-buffer-id)))
|
||||
"Powerline mode-line face"
|
||||
:group 'powerline)
|
||||
|
||||
(defcustom powerline-default-separator 'arrow
|
||||
"The separator to use for the default theme.
|
||||
|
||||
Valid Values: alternate, arrow, arrow-fade, bar, box, brace,
|
||||
butt, chamfer, contour, curve, rounded, roundstub, wave, zigzag,
|
||||
utf-8."
|
||||
:group 'powerline
|
||||
:type '(choice (const alternate)
|
||||
(const arrow)
|
||||
(const arrow-fade)
|
||||
(const bar)
|
||||
(const box)
|
||||
(const brace)
|
||||
(const butt)
|
||||
(const chamfer)
|
||||
(const contour)
|
||||
(const curve)
|
||||
(const rounded)
|
||||
(const roundstub)
|
||||
(const slant)
|
||||
(const wave)
|
||||
(const zigzag)
|
||||
(const utf-8)
|
||||
(const nil)))
|
||||
|
||||
(defcustom powerline-utf-8-separator-left #xe0b0
|
||||
"The unicode character number for the left facing separator"
|
||||
:group 'powerline
|
||||
:type '(choice integer (const nil)))
|
||||
|
||||
(defcustom powerline-utf-8-separator-right #xe0b2
|
||||
"The unicode character number for the right facing separator"
|
||||
:group 'powerline
|
||||
:type '(choice integer (const nil)))
|
||||
|
||||
(defcustom powerline-default-separator-dir '(left . right)
|
||||
"The separator direction to use for the default theme.
|
||||
|
||||
CONS of the form (DIR . DIR) denoting the lean of the
|
||||
separators for the left and right side of the powerline.
|
||||
|
||||
DIR must be one of: left, right"
|
||||
:group 'powerline
|
||||
:type '(cons (choice :tag "Left Hand Side" (const left) (const right))
|
||||
(choice :tag "Right Hand Side" (const left) (const right))))
|
||||
|
||||
(defcustom powerline-height nil
|
||||
"Override the mode-line height."
|
||||
:group 'powerline
|
||||
:type '(choice integer (const nil)))
|
||||
|
||||
(defcustom powerline-text-scale-factor nil
|
||||
"Scale of mode-line font size to default text size.
|
||||
|
||||
Smaller mode-line fonts will be a float value less that 1.
|
||||
Larger mode-line fonts require a float value greater than 1.
|
||||
|
||||
This is needed to make sure that text is properly aligned."
|
||||
:group 'powerline
|
||||
:type '(choice float integer (const nil)))
|
||||
|
||||
(defcustom powerline-buffer-size-suffix t
|
||||
"Display the buffer size suffix."
|
||||
:group 'powerline
|
||||
:type 'boolean)
|
||||
|
||||
(defcustom powerline-gui-use-vcs-glyph nil
|
||||
"Display a unicode character to represent a version control system. Not always supported in GUI."
|
||||
:group 'powerline
|
||||
:type 'boolean)
|
||||
|
||||
(defun pl/create-or-get-cache ()
|
||||
"Return a frame-local hash table that acts as a memoization cache for powerline. Create one if the frame doesn't have one yet."
|
||||
(let ((table (frame-parameter nil 'powerline-cache)))
|
||||
(if (hash-table-p table) table (pl/reset-cache))))
|
||||
|
||||
(defun pl/reset-cache ()
|
||||
"Reset and return the frame-local hash table used for a memoization cache."
|
||||
(let ((table (make-hash-table :test 'equal)))
|
||||
;; Store it as a frame-local variable
|
||||
(modify-frame-parameters nil `((powerline-cache . ,table)))
|
||||
table))
|
||||
|
||||
(defun powerline-current-separator ()
|
||||
"Get the current default separator. Always returns utf-8 in non-gui mode."
|
||||
(if window-system
|
||||
powerline-default-separator
|
||||
'utf-8))
|
||||
|
||||
;;
|
||||
;; the frame-local powerline cache causes problems if included in a saved desktop,
|
||||
;; so delete it before the desktop is saved.
|
||||
;;
|
||||
;; see https://github.com/milkypostman/powerline/issues/58
|
||||
;;
|
||||
;; It is better to put the following code into your init file for Emacs 24.4 or later.
|
||||
;; (require 'frameset)
|
||||
;; (push '(powerline-cache . :never) frameset-filter-alist)
|
||||
;;
|
||||
(defun powerline-delete-cache (&optional frame)
|
||||
"Set the FRAME cache to nil."
|
||||
(set-frame-parameter frame 'powerline-cache nil))
|
||||
|
||||
(defun powerline-desktop-save-delete-cache ()
|
||||
"Set all caches to nil unless `frameset-filter-alist' has :never for powerline-cache."
|
||||
(unless (and (boundp 'frameset-filter-alist)
|
||||
(eq (cdr (assq 'powerline-cache frameset-filter-alist))
|
||||
:never))
|
||||
(dolist (fr (frame-list)) (powerline-delete-cache fr))))
|
||||
|
||||
(add-hook 'desktop-save-hook 'powerline-desktop-save-delete-cache)
|
||||
|
||||
;; from memoize.el @ http://nullprogram.com/blog/2010/07/26/
|
||||
(defun pl/memoize (func)
|
||||
"Memoize FUNC.
|
||||
If argument is a symbol then install the memoized function over
|
||||
the original function. Use frame-local memoization."
|
||||
(cl-typecase func
|
||||
(symbol (fset func (pl/memoize-wrap-frame-local (symbol-function func))) func)
|
||||
(function (pl/memoize-wrap-frame-local func))))
|
||||
|
||||
(defun pl/memoize-wrap-frame-local (func)
|
||||
"Return the memoized version of FUNC.
|
||||
The memoization cache is frame-local."
|
||||
(let ((funcid (cl-gensym)))
|
||||
`(lambda (&rest args)
|
||||
,(concat (documentation func) (format "\n(memoized function %s)" funcid))
|
||||
(let* ((cache (pl/create-or-get-cache))
|
||||
(key (cons ',funcid args))
|
||||
(val (gethash key cache)))
|
||||
(if val
|
||||
val
|
||||
(puthash key (apply ,func args) cache))))))
|
||||
|
||||
(defun pl/separator-height ()
|
||||
"Get default height for rendering separators."
|
||||
(or powerline-height (frame-char-height)))
|
||||
|
||||
(defun powerline-reset ()
|
||||
"Reset memoized functions."
|
||||
(interactive)
|
||||
(pl/memoize (pl/alternate left))
|
||||
(pl/memoize (pl/alternate right))
|
||||
(pl/memoize (pl/arrow left))
|
||||
(pl/memoize (pl/arrow right))
|
||||
(pl/memoize (pl/arrow-fade left))
|
||||
(pl/memoize (pl/arrow-fade right))
|
||||
(pl/memoize (pl/bar left))
|
||||
(pl/memoize (pl/bar right))
|
||||
(pl/memoize (pl/box left))
|
||||
(pl/memoize (pl/box right))
|
||||
(pl/memoize (pl/brace left))
|
||||
(pl/memoize (pl/brace right))
|
||||
(pl/memoize (pl/butt left))
|
||||
(pl/memoize (pl/butt right))
|
||||
(pl/memoize (pl/chamfer left))
|
||||
(pl/memoize (pl/chamfer right))
|
||||
(pl/memoize (pl/contour left))
|
||||
(pl/memoize (pl/contour right))
|
||||
(pl/memoize (pl/curve left))
|
||||
(pl/memoize (pl/curve right))
|
||||
(pl/memoize (pl/rounded left))
|
||||
(pl/memoize (pl/rounded right))
|
||||
(pl/memoize (pl/roundstub left))
|
||||
(pl/memoize (pl/roundstub right))
|
||||
(pl/memoize (pl/slant left))
|
||||
(pl/memoize (pl/slant right))
|
||||
(pl/memoize (pl/wave left))
|
||||
(pl/memoize (pl/wave right))
|
||||
(pl/memoize (pl/zigzag left))
|
||||
(pl/memoize (pl/zigzag right))
|
||||
(pl/memoize (pl/nil left))
|
||||
(pl/memoize (pl/nil right))
|
||||
(pl/utf-8 left)
|
||||
(pl/utf-8 right)
|
||||
(pl/reset-cache))
|
||||
|
||||
(powerline-reset)
|
||||
|
||||
(defun pl/make-xpm (name color1 color2 data)
|
||||
"Return an XPM image with NAME using COLOR1 for enabled and COLOR2 for disabled bits specified in DATA."
|
||||
(when window-system
|
||||
(create-image
|
||||
(concat
|
||||
(format "/* XPM */
|
||||
static char * %s[] = {
|
||||
\"%i %i 2 1\",
|
||||
\". c %s\",
|
||||
\" c %s\",
|
||||
"
|
||||
(downcase (replace-regexp-in-string " " "_" name))
|
||||
(length (car data))
|
||||
(length data)
|
||||
(or (pl/hex-color color1) "None")
|
||||
(or (pl/hex-color color2) "None"))
|
||||
(let ((len (length data))
|
||||
(idx 0))
|
||||
(apply 'concat
|
||||
(mapcar #'(lambda (dl)
|
||||
(setq idx (+ idx 1))
|
||||
(concat
|
||||
"\""
|
||||
(concat
|
||||
(mapcar #'(lambda (d)
|
||||
(if (eq d 0)
|
||||
(string-to-char " ")
|
||||
(string-to-char ".")))
|
||||
dl))
|
||||
(if (eq idx len)
|
||||
"\"};"
|
||||
"\",\n")))
|
||||
data))))
|
||||
'xpm t :ascent 'center)))
|
||||
|
||||
(defun pl/percent-xpm
|
||||
(height pmax pmin winend winstart width color1 color2)
|
||||
"Generate percentage xpm of HEIGHT for PMAX to PMIN given WINEND and WINSTART with WIDTH and COLOR1 and COLOR2."
|
||||
(let* ((height- (1- height))
|
||||
(fillstart (round (* height- (/ (float winstart) (float pmax)))))
|
||||
(fillend (round (* height- (/ (float winend) (float pmax)))))
|
||||
(data nil)
|
||||
(i 0))
|
||||
(while (< i height)
|
||||
(setq data (cons
|
||||
(if (and (<= fillstart i)
|
||||
(<= i fillend))
|
||||
(append (make-list width 1))
|
||||
(append (make-list width 0)))
|
||||
data))
|
||||
(setq i (+ i 1)))
|
||||
(pl/make-xpm "percent" color1 color2 (reverse data))))
|
||||
|
||||
(pl/memoize 'pl/percent-xpm)
|
||||
|
||||
;;;###autoload
|
||||
(defun powerline-hud (face1 face2 &optional width)
|
||||
"Return an XPM of relative buffer location using FACE1 and FACE2 of optional WIDTH."
|
||||
(unless width (setq width 2))
|
||||
(let ((color1 (if face1 (face-background face1) "None"))
|
||||
(color2 (if face2 (face-background face2) "None"))
|
||||
(height (or powerline-height (frame-char-height)))
|
||||
pmax
|
||||
pmin
|
||||
(ws (window-start))
|
||||
(we (window-end)))
|
||||
(save-restriction
|
||||
(widen)
|
||||
(setq pmax (point-max))
|
||||
(setq pmin (point-min)))
|
||||
(pl/percent-xpm height pmax pmin we ws
|
||||
(* (frame-char-width) width) color1 color2)))
|
||||
|
||||
;;;###autoload
|
||||
(defun powerline-mouse (click-group click-type string)
|
||||
"Return mouse handler for CLICK-GROUP given CLICK-TYPE and STRING."
|
||||
(cond ((eq click-group 'minor)
|
||||
(cond ((eq click-type 'menu)
|
||||
`(lambda (event)
|
||||
(interactive "@e")
|
||||
(minor-mode-menu-from-indicator ,string)))
|
||||
((eq click-type 'help)
|
||||
`(lambda (event)
|
||||
(interactive "@e")
|
||||
(describe-minor-mode-from-indicator ,string)))
|
||||
(t
|
||||
`(lambda (event)
|
||||
(interactive "@e")
|
||||
nil))))
|
||||
(t
|
||||
`(lambda (event)
|
||||
(interactive "@e")
|
||||
nil))))
|
||||
|
||||
;;;###autoload
|
||||
(defun powerline-concat (&rest strings)
|
||||
"Concatonate STRINGS and pad sides by spaces."
|
||||
(concat
|
||||
" "
|
||||
(mapconcat 'identity (delq nil strings) " ")
|
||||
" "))
|
||||
|
||||
;;;###autoload
|
||||
(defmacro defpowerline (name body)
|
||||
"Create function NAME by wrapping BODY with powerline padding an propetization."
|
||||
`(defun ,name
|
||||
(&optional face pad)
|
||||
(powerline-raw ,body face pad)))
|
||||
|
||||
(defun pl/property-substrings (str prop)
|
||||
"Return a list of substrings of STR when PROP change."
|
||||
(let ((beg 0) (end 0)
|
||||
(len (length str))
|
||||
(out))
|
||||
(while (< end (length str))
|
||||
(setq end (or (next-single-property-change beg prop str) len))
|
||||
(setq out (append out (list (substring str beg (setq beg end))))))
|
||||
out))
|
||||
|
||||
(defun pl/assure-list (item)
|
||||
"Assure that ITEM is a list."
|
||||
(if (listp item)
|
||||
item
|
||||
(list item)))
|
||||
|
||||
(defun pl/add-text-property (str prop val)
|
||||
(mapconcat
|
||||
(lambda (mm)
|
||||
(let ((cur (pl/assure-list (get-text-property 0 'face mm))))
|
||||
(propertize mm 'face (append cur (list val)))))
|
||||
(pl/property-substrings str prop)
|
||||
""))
|
||||
|
||||
;;;###autoload
|
||||
(defun powerline-raw (str &optional face pad)
|
||||
"Render STR as mode-line data using FACE and optionally PAD import on left (l) or right (r)."
|
||||
(when str
|
||||
(let* ((rendered-str (format-mode-line str))
|
||||
(padded-str (concat
|
||||
(when (and (> (length rendered-str) 0) (eq pad 'l)) " ")
|
||||
(if (listp str) rendered-str str)
|
||||
(when (and (> (length rendered-str) 0) (eq pad 'r)) " "))))
|
||||
|
||||
(if face
|
||||
(pl/add-text-property padded-str 'face face)
|
||||
padded-str))))
|
||||
|
||||
;;;###autoload
|
||||
(defun powerline-fill (face reserve)
|
||||
"Return empty space using FACE and leaving RESERVE space on the right."
|
||||
(unless reserve
|
||||
(setq reserve 20))
|
||||
(when powerline-text-scale-factor
|
||||
(setq reserve (* powerline-text-scale-factor reserve)))
|
||||
(when (and window-system (eq 'right (get-scroll-bar-mode)))
|
||||
(setq reserve (- reserve 3)))
|
||||
(propertize " "
|
||||
'display `((space :align-to (- (+ right right-fringe right-margin) ,reserve)))
|
||||
'face face))
|
||||
|
||||
(defun powerline-fill-center (face reserve)
|
||||
"Return empty space using FACE to the center of remaining space leaving RESERVE space on the right."
|
||||
(unless reserve
|
||||
(setq reserve 20))
|
||||
(when powerline-text-scale-factor
|
||||
(setq reserve (* powerline-text-scale-factor reserve)))
|
||||
(propertize " "
|
||||
'display `((space :align-to (- (+ center (.5 . right-margin)) ,reserve
|
||||
(.5 . left-margin))))
|
||||
'face face))
|
||||
|
||||
;;;###autoload (autoload 'powerline-major-mode "powerline")
|
||||
(defpowerline powerline-major-mode
|
||||
(propertize (format-mode-line mode-name)
|
||||
'mouse-face 'mode-line-highlight
|
||||
'help-echo "Major mode\n\ mouse-1: Display major mode menu\n\ mouse-2: Show help for major mode\n\ mouse-3: Toggle minor modes"
|
||||
'local-map (let ((map (make-sparse-keymap)))
|
||||
(define-key map [mode-line down-mouse-1]
|
||||
`(menu-item ,(purecopy "Menu Bar") ignore
|
||||
:filter (lambda (_) (mouse-menu-major-mode-map))))
|
||||
(define-key map [mode-line mouse-2] 'describe-mode)
|
||||
(define-key map [mode-line down-mouse-3] mode-line-mode-menu)
|
||||
map)))
|
||||
|
||||
;;;###autoload (autoload 'powerline-minor-modes "powerline")
|
||||
(defpowerline powerline-minor-modes
|
||||
(mapconcat (lambda (mm)
|
||||
(propertize mm
|
||||
'mouse-face 'mode-line-highlight
|
||||
'help-echo "Minor mode\n mouse-1: Display minor mode menu\n mouse-2: Show help for minor mode\n mouse-3: Toggle minor modes"
|
||||
'local-map (let ((map (make-sparse-keymap)))
|
||||
(define-key map
|
||||
[mode-line down-mouse-1]
|
||||
(powerline-mouse 'minor 'menu mm))
|
||||
(define-key map
|
||||
[mode-line mouse-2]
|
||||
(powerline-mouse 'minor 'help mm))
|
||||
(define-key map
|
||||
[mode-line down-mouse-3]
|
||||
(powerline-mouse 'minor 'menu mm))
|
||||
(define-key map
|
||||
[header-line down-mouse-3]
|
||||
(powerline-mouse 'minor 'menu mm))
|
||||
map)))
|
||||
(split-string (format-mode-line minor-mode-alist))
|
||||
(propertize " " 'face face)))
|
||||
|
||||
;;;###autoload (autoload 'powerline-narrow "powerline")
|
||||
(defpowerline powerline-narrow
|
||||
(let (real-point-min real-point-max)
|
||||
(save-excursion
|
||||
(save-restriction
|
||||