| @ -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 | |||||