| @ -0,0 +1,70 @@ | |||
| powerline | |||
| ========= | |||
| Emacs version of the Vim powerline. | |||
| This is a proposed version 2.0 of the original [Emacs Powerline](http://www.emacswiki.org/emacs/PowerLine) which is a fork of [vim-powerline](https://github.com/Lokaltog/vim-powerline). | |||
| ## Installation | |||
| (require 'powerline) | |||
| (powerline-default-theme) | |||
| The second line customizes `mode-line-format` according to the default theme. | |||
| There are two builtin themes: `powerline-default-theme` and `powerline-center-theme`. | |||
| You can revert back to the original value of `mode-line-format` that was being used when powerline was loaded using `powerline-revert`. | |||
| ## Faces | |||
| The faces that powerline uses for the builtin themes are `powerline-active1` and `powerline-active2` for the active modeline, and `powerline-inactive1` ande `powerline-inactive2` for the inactive modelines. If you create your own theme, you can add as many faces as you want and pass those faces to the corresponding `powerline-*` functions when creating your `mode-line-format`. | |||
| ## Custom Themes | |||
| Please look over the `powerline-default-theme` and `powerline-center-theme` in [`powerline.el`](https://github.com/milkypostman/powerline/blob/master/powerline.el) for examples of themes that involve different justifications of modeline text. | |||
| You can write your own powerline theme by simply setting your own `mode-line-format` to be an evaluation (`:eval`) of the powerline functions. Notice in `powerline-default-theme` the `let*` defines two lists: `lhs` and `rhs` which are exactly the lists that define what goes on the left and right sides of the modeline. The `powerline-center-theme` demonstrates how to *center* justify part of the modeline and defines an additional `center` list which is exactly the modeline components to be displayed in the middle section. | |||
| In *most* circumstances you should only need to modify the builtin themes unless you are trying to do a particularly unique layout. | |||
| ### Explanation | |||
| This theme does some tricks to improve performance and get all the text justified properly. First, it sets `lhs` and `rhs` to a list of powerline sections. You can easily re-utilize builtin modeline formatting by adding it as a raw powerline section. For example, | |||
| (powerline-raw mode-line-mule-info nil 'l) | |||
| would add the formatting defined in `mode-line-mule-info` to the modeline as it appears in the default modeline. | |||
| The last line of this is what actually puts it all together, by concatonating the `lhs`, some "fill" space, and `rhs`. This *must* be done to ensure that the padding in between the left and right sections properly fills the modeline. | |||
| ## Improvements from this rewrite: | |||
| * Cleaner code. | |||
| * Try to simply be a *library* that provides functions for generating a mode-line | |||
| * Make right-aligned text actually be flush against the right side. | |||
| * Separators are designed to dynamically size their height based on the font settings. | |||
| * Separators spread their width to the nearest character width. (This is required to make right-aligned text actually be right-aligned) | |||
| ## Implementing New Separators | |||
| The function should return an XPM image created using the `create-image` function. | |||
| There is a function called `memoize` that will help make calling the function multiple times with the same parameters be much quicker by caching the return value. | |||
| Each divider should have the signature: `(face1 face2 &optional height)` | |||
| `face1` : the left-hand face | |||
| `face2` : the right-hand face | |||
| `height` : specifies the height of the XPM, most of time this is `(font-char-height)` | |||
| Separators should consider the `height` when they are created so that the mode-line can change sizes based on the font height. | |||
| @ -0,0 +1,336 @@ | |||
| ;;; powerline-separators.el --- Separators 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: | |||
| ;; | |||
| ;; 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) | |||
| (defun pl/interpolate (color1 color2) | |||
| "Interpolate between COLOR1 and COLOR2. | |||
| COLOR1 and COLOR2 must be supplied as hex strings with a leading #." | |||
| (let* ((c1 (replace-regexp-in-string "#" "" color1)) | |||
| (c2 (replace-regexp-in-string "#" "" color2)) | |||
| (c1r (string-to-number (substring c1 0 2) 16)) | |||
| (c1g (string-to-number (substring c1 4 6) 16)) | |||
| (c1b (string-to-number (substring c1 2 4) 16)) | |||
| (c2r (string-to-number (substring c2 0 2) 16)) | |||
| (c2g (string-to-number (substring c2 4 6) 16)) | |||
| (c2b (string-to-number (substring c2 2 4) 16)) | |||
| (red (/ (+ c1r c2r) 2)) | |||
| (green (/ (+ c1g c2g) 2)) | |||
| (blue (/ (+ c1b c2b) 2))) | |||
| (format "#%02X%02X%02X" red green blue))) | |||
| (defun pl/hex-color (color) | |||
| "Get the hexadecimal value of COLOR." | |||
| (let ((ret color)) | |||
| (cond ((and (stringp color) (string= "#" (substring color 0 1))) | |||
| (setq ret (upcase ret))) | |||
| ((color-defined-p color) | |||
| (setq ret (concat "#" | |||
| (mapconcat (lambda (val) | |||
| (format "%02X" (* val 255))) | |||
| (color-name-to-rgb color) | |||
| "")))) | |||
| (t | |||
| (setq ret nil))) | |||
| (symbol-value 'ret))) | |||
| (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-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 is required, all other components are optional. | |||
| 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* ((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)))) | |||
| (pl/wrap-defun name dir width | |||
| `((pattern-height (max (- height ,reserve) 0)) | |||
| (second-pattern-height (/ pattern-height 2)) | |||
| (pattern-height ,(if second-pattern '(ceiling pattern-height 2) 'pattern-height))) | |||
| `((mapconcat 'identity ',header "") | |||
| (mapconcat 'identity (subseq ',pattern 0 pattern-height) "") | |||
| (mapconcat 'identity ',center "") | |||
| (mapconcat 'identity (subseq ',second-pattern 0 second-pattern-height) "") | |||
| (mapconcat 'identity ',footer ""))))) | |||
| (defun pl/wrap-defun (name dir width let-vars body) | |||
| "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 | |||
| (message "pl/ generating new separator") | |||
| (unless height | |||
| (setq height (pl/separator-height))) | |||
| (let* ,(append `((color1 (when ,src-face | |||
| (pl/hex-color (face-attribute ,src-face :background)))) | |||
| (color2 (when ,dst-face | |||
| (pl/hex-color (face-attribute ,dst-face :background)))) | |||
| (colori (when (and color1 color2) (pl/interpolate color1 color2))) | |||
| (color1 (or color1 "None")) | |||
| (color2 (or color2 "None")) | |||
| (colori (or colori "None"))) | |||
| let-vars) | |||
| (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))))))) | |||
| (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)))) | |||
| (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)))) | |||
| `((loop for i from 0 to width | |||
| concat (pl/pattern-to-string (,row-modifier (pl/row-pattern i middle-width)))) | |||
| (when (oddp height) | |||
| (pl/pattern-to-string (make-list middle-width 0))) | |||
| (loop for i from width downto 0 | |||
| concat (pl/pattern-to-string (,row-modifier (pl/row-pattern i middle-width)))))))) | |||
| (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)))) | |||
| `((loop for i from 0 to width | |||
| concat (pl/pattern-to-string (,row-modifier (pl/row-pattern i middle-width 2)))) | |||
| (when (oddp height) | |||
| (pl/pattern-to-string (,row-modifier (pl/row-pattern (1+ width) middle-width 2)))) | |||
| (loop for i from width downto 0 | |||
| concat (pl/pattern-to-string (,row-modifier (pl/row-pattern i middle-width 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)))) | |||
| (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)))) | |||
| (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)))) | |||
| (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)))) | |||
| (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)))) | |||
| (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)))) | |||
| (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)))) | |||
| (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)))) | |||
| (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)))) | |||
| `((loop for i from 0 to height | |||
| concat (pl/pattern-to-string (,row-modifier (pl/row-pattern (/ i 2) width)))))))) | |||
| (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)))) | |||
| (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)))) | |||
| (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)) | |||
| (provide 'powerline-separators) | |||
| ;;; powerline-separators.el ends here | |||
| @ -0,0 +1,248 @@ | |||
| ;;; 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: | |||
| ;;;###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 (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-default-separator | |||
| (car powerline-default-separator-dir)))) | |||
| (separator-right (intern (format "powerline-%s-%s" | |||
| powerline-default-separator | |||
| (cdr powerline-default-separator-dir)))) | |||
| (lhs (list (powerline-raw "%*" nil 'l) | |||
| (powerline-buffer-size nil 'l) | |||
| (powerline-raw mode-line-mule-info nil 'l) | |||
| (powerline-buffer-id nil '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 (boundp 'erc-modified-channels-object) | |||
| (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))) | |||
| (rhs (list (powerline-raw global-mode-string face2 'r) | |||
| (funcall separator-right face2 face1) | |||
| (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" nil 'r) | |||
| (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 (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-default-separator | |||
| (car powerline-default-separator-dir)))) | |||
| (separator-right (intern (format "powerline-%s-%s" | |||
| powerline-default-separator | |||
| (cdr powerline-default-separator-dir)))) | |||
| (lhs (list (powerline-raw "%*" nil 'l) | |||
| (powerline-buffer-size nil 'l) | |||
| (powerline-buffer-id nil '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" nil 'r) | |||
| (powerline-hud face2 face1))) | |||
| (center (list (powerline-raw " " face1) | |||
| (funcall separator-left face1 face2) | |||
| (when (boundp 'erc-modified-channels-object) | |||
| (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 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-default-separator | |||
| (car powerline-default-separator-dir)))) | |||
| (separator-right (intern (format "powerline-%s-%s" | |||
| powerline-default-separator | |||
| (cdr powerline-default-separator-dir)))) | |||
| (lhs (list (powerline-raw "%*" nil 'l) | |||
| (powerline-buffer-size nil 'l) | |||
| (powerline-buffer-id nil '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" nil 'r) | |||
| (powerline-hud face2 face1))) | |||
| (center (append (list (powerline-raw " " face1) | |||
| (funcall separator-left face1 face2) | |||
| (when (boundp 'erc-modified-channels-object) | |||
| (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-default-separator | |||
| (car powerline-default-separator-dir)))) | |||
| (separator-right (intern (format "powerline-%s-%s" | |||
| powerline-default-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 (boundp 'erc-modified-channels-object) | |||
| (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,492 @@ | |||
| ;;; 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.1 | |||
| ;; 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: | |||
| (require 'powerline-themes) | |||
| (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) | |||
| (defcustom powerline-default-separator 'arrow | |||
| "The separator to use for the default theme. | |||
| Valid Values: arrow, slant, chamfer, wave, brace, roundstub, | |||
| zigzag, butt, rounded, contour, curve" | |||
| :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 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) | |||
| (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." | |||
| (or (frame-parameter nil 'powerline-cache) | |||
| (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)) | |||
| ;; 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/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-attribute face1 :background) "None")) | |||
| (color2 (if face2 (face-attribute face2 :background) "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 | |||
| (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 | |||
| (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 | |||
| (defpowerline powerline-narrow | |||
| (let (real-point-min real-point-max) | |||
| (save-excursion | |||
| (save-restriction | |||
| (widen) | |||
| (setq real-point-min (point-min) real-point-max (point-max)))) | |||
| (when (or (/= real-point-min (point-min)) | |||
| (/= real-point-max (point-max))) | |||
| (propertize "Narrow" | |||
| 'mouse-face 'mode-line-highlight | |||
| 'help-echo "mouse-1: Remove narrowing from the current buffer" | |||
| 'local-map (make-mode-line-mouse-map | |||
| 'mouse-1 'mode-line-widen))))) | |||
| ;;;###autoload | |||
| (defpowerline powerline-vc | |||
| (when (and (buffer-file-name (current-buffer)) | |||
| vc-mode) | |||
| (format-mode-line '(vc-mode vc-mode)))) | |||
| ;;;###autoload | |||
| (defpowerline powerline-buffer-size | |||
| (propertize | |||
| (if powerline-buffer-size-suffix | |||
| "%I" | |||
| "%i") | |||
| 'mouse-face 'mode-line-highlight | |||
| 'local-map (make-mode-line-mouse-map | |||
| 'mouse-1 (lambda () (interactive) | |||
| (setq powerline-buffer-size-suffix | |||
| (not powerline-buffer-size-suffix)) | |||
| (redraw-modeline))))) | |||
| ;;;###autoload | |||
| (defpowerline powerline-buffer-id | |||
| (format-mode-line mode-line-buffer-identification)) | |||
| ;;;###autoload | |||
| (defpowerline powerline-process | |||
| (cond | |||
| ((listp mode-line-process) (format-mode-line mode-line-process)) | |||
| (t mode-line-process))) | |||
| (defvar pl/default-mode-line mode-line-format) | |||
| (defvar pl/minibuffer-selected-window-list '()) | |||
| (defun pl/minibuffer-selected-window () | |||
| "Return the selected window when entereing the minibuffer." | |||
| (when pl/minibuffer-selected-window-list | |||
| (car pl/minibuffer-selected-window-list))) | |||
| (defun pl/minibuffer-setup () | |||
| "Save the `minibuffer-selected-window' to `pl/minibuffer-selected-window'." | |||
| (push (minibuffer-selected-window) pl/minibuffer-selected-window-list)) | |||
| (add-hook 'minibuffer-setup-hook 'pl/minibuffer-setup) | |||
| (defun pl/minibuffer-exit () | |||
| "Set `pl/minibuffer-selected-window' to nil." | |||
| (pop pl/minibuffer-selected-window-list)) | |||
| (add-hook 'minibuffer-exit-hook 'pl/minibuffer-exit) | |||
| (defun powerline-selected-window-active () | |||
| "Return whether the current window is active." | |||
| (or (eq (frame-selected-window) | |||
| (selected-window)) | |||
| (and (minibuffer-window-active-p | |||
| (frame-selected-window)) | |||
| (eq (pl/minibuffer-selected-window) | |||
| (selected-window))))) | |||
| (defun powerline-revert () | |||
| "Revert to the default Emacs mode-line." | |||
| (interactive) | |||
| (setq-default mode-line-format pl/default-mode-line)) | |||
| (defun pl/render (item) | |||
| "Render a powerline ITEM." | |||
| (cond | |||
| ((and (listp item) (eq 'image (car item))) | |||
| (propertize " " 'display item | |||
| 'face (plist-get (cdr item) :face))) | |||
| (item item))) | |||
| (defun powerline-render (values) | |||
| "Render a list of powerline VALUES." | |||
| (mapconcat 'pl/render values "")) | |||
| (defun powerline-width (values) | |||
| "Get the length of VALUES." | |||
| (if values | |||
| (let ((val (car values))) | |||
| (+ (cond | |||
| ((stringp val) (length (format-mode-line val))) | |||
| ((and (listp val) (eq 'image (car val))) | |||
| (car (image-size val))) | |||
| (t 0)) | |||
| (powerline-width (cdr values)))) | |||
| 0)) | |||
| ;; weird hack to fix bug #29 | |||
| (message "powerlne loaded") | |||
| (provide 'powerline) | |||
| ;;; powerline.el ends here | |||