-
Notifications
You must be signed in to change notification settings - Fork 177
Spaceline
Dom Charlesworth edited this page Nov 7, 2016
·
5 revisions
All the Icons can be used to enrich the visual representation of your Mode Line using Spaceline.
I have personally switched to using Spaceline rather than a custom
made Mode Line I had previously. So, if you use spaceline
already,
you can just add in these
The package code can be saved from the code below somewhere in your load path as spaceline-all-the-icons.el
.
;;; spaceline-all-the-icons.el --- Custom install for all the icons Spaceline
;; Copyright (C) 2016 Dominic Charlesworth <[email protected]>
;; Author: Dominic Charlesworth <[email protected]>
;; Keywords: lisp
;; This program is free software; you can redistribute it and/or
;; modify it under the terms of the GNU General Public License
;; as published by the Free Software Foundation; either version 3
;; of the License, or (at your option) any later version.
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;;; Code:
(require 'spaceline)
(require 'spaceline-config)
(require 'all-the-icons)
;;---------------;;
;; First Segment ;;
;;---------------;;
(spaceline-define-segment
ati-modified "An `all-the-icons' modified segment"
(let* ((config-alist
'(("*" all-the-icons-faicon-family all-the-icons-faicon "chain-broken" :height 1.2 :v-adjust -0.0)
("-" all-the-icons-faicon-family all-the-icons-faicon "link" :height 1.2 :v-adjust -0.0)
("%" all-the-icons-octicon-family all-the-icons-octicon "lock" :height 1.2 :v-adjust 0.1)))
(result (cdr (assoc (format-mode-line "%*") config-alist))))
(propertize (format "%s" (apply (cadr result) (cddr result))) 'face `(:family ,(funcall (car result)) :inherit )))
:tight t)
(spaceline-define-segment
ati-window-numbering "An `all-the-icons' window numbering segment"
(propertize (format "%c" (+ 9311 (window-numbering-get-number)))
'face `(:height 1.3 :inherit)
'display '(raise -0.0))
:tight t :when (fboundp 'window-numbering-mode))
(spaceline-define-segment
ati-projectile "An `all-the-icons' segment for current `projectile' project"
(concat
(propertize "|" 'face '(:height 1.1 :inherit))
" "
(if (and (fboundp 'projectile-project-name)
(projectile-project-name))
(propertize (format "%s" (concat (projectile-project-name) ))
'face '(:height 0.8 :inherit)
'display '(raise 0.2)
'help-echo "Switch Project"
'mouse-face '(:box 1)
'local-map (make-mode-line-mouse-map
'mouse-1 (lambda () (interactive) (projectile-switch-project))))
(propertize "×" 'face '(:height 0.8 :inherit)))
" "
(propertize "|" 'face '(:height 1.1 :inherit)))
:tight t)
(spaceline-define-segment
ati-mode-icon "An `all-the-icons' segment for the current buffer mode"
(let ((icon (all-the-icons-icon-for-buffer)))
(unless (symbolp icon) ;; This implies it's the major mode
(propertize icon
'help-echo (format "Major-mode: `%s`" major-mode)
'display '(raise 0.0)
'face `(:height 1.0 :family ,(all-the-icons-icon-family-for-buffer) :inherit)))))
(spaceline-define-segment
ati-buffer-id "An `all-the-icons' segment for the current buffer id"
(if (fboundp 'projectile-project-root)
(let* ((buf (or (buffer-file-name) (buffer-name)))
(proj (ignore-errors (projectile-project-root)) )
(name (if (buffer-file-name)
(or (cadr (split-string buf proj))
(format-mode-line "%b"))
(format-mode-line "%b"))))
(propertize (format "%s" name)
'face `(:height 0.8 :inherit)
'display '(raise 0.2)
'help-echo (format "Major-mode: `%s`" major-mode)))
(propertize (format-mode-line "%b ") 'face '(:height 0.8 :inherit) 'display '(raise 0.1)))
:tight t)
;;----------------;;
;; Second Segment ;;
;;----------------;;
(spaceline-define-segment
ati-process "An `all-the-icons' segment for the current process"
(let ((icon (all-the-icons-icon-for-buffer)))
(concat
(when (or (symbolp icon) mode-line-process)
(propertize (format-mode-line "%m") 'face `(:height 0.8 :inherit) 'display '(raise 0.2)))
(when mode-line-process
(propertize (format-mode-line mode-line-process) 'face '(:height 0.7 :inherit) 'display '(raise 0.2)))))
:tight t)
(spaceline-define-segment
ati-position "An `all-the-icons' segment for the Row and Column of the current point"
(propertize (format-mode-line "%l:%c") 'face `(:height 0.9 :inherit) 'display '(raise 0.1)))
(spaceline-define-segment
ati-region-info "An `all-the-icons' segment for the currently marked region"
(when mark-active
(let ((words (count-lines (region-beginning) (region-end)))
(chars (count-words (region-end) (region-beginning))))
(concat
(propertize (format "%s " (all-the-icons-octicon "pencil") words chars)
'face `(:family ,(all-the-icons-octicon-family) :inherit) 'display '(raise 0.1))
(propertize (format "(%s, %s)" words chars)
'face `(:height 0.9 :inherit))))))
(spaceline-define-segment
ati-color-control "An `all-the-icons' segment for the currently marked region" "")
;;----------------;;
;; Third Segement ;;
;;----------------;;
(defun spaceline---github-vc ()
"Function to return the Spaceline formatted GIT Version Control text."
(let ((branch (mapconcat 'concat (cdr (split-string vc-mode "[:-]")) "-")))
(concat
(propertize (all-the-icons-alltheicon "git") 'face '(:height 1.1 :inherit) 'display '(raise 0.1))
(propertize " · ")
(propertize (format "%s" (all-the-icons-octicon "git-branch"))
'face `(:family ,(all-the-icons-octicon-family) :height 1.0 :inherit)
'display '(raise 0.2))
(propertize (format " %s" branch) 'face `(:height 0.9 :inherit) 'display '(raise 0.2)))))
(defun spaceline---svn-vc ()
"Function to return the Spaceline formatted SVN Version Control text."
(let ((revision (cadr (split-string vc-mode "-"))))
(concat
(propertize (format " %s" (all-the-icons-faicon "cloud")) 'face `(:height 1.2) 'display '(raise -0.1))
(propertize (format " · %s" revision) 'face `(:height 0.9)))))
(spaceline-define-segment
ati-vc-icon "An `all-the-icons' segment for the current Version Control icon"
(when vc-mode
(cond ((string-match "Git[:-]" vc-mode) (spaceline---github-vc))
((string-match "SVN-" vc-mode) (spaceline---svn-vc))
(t (propertize (format "%s" vc-mode)))))
:when active)
(spaceline-define-segment
ati-flycheck-status "An `all-the-icons' representaiton of `flycheck-status'"
(let* ((text
(pcase flycheck-last-status-change
(`finished (if flycheck-current-errors
(let ((count (let-alist (flycheck-count-errors flycheck-current-errors)
(+ (or .warning 0) (or .error 0)))))
(format "✖ %s Issue%s" count (if (eq 1 count) "" "s")))
"✔ No Issues"))
(`running "⟲ Running")
(`no-checker "⚠ No Checker")
(`not-checked "✖ Disabled")
(`errored "⚠ Error")
(`interrupted "⛔ Interrupted")
(`suspicious "")))
(f (cond
((string-match "⚠" text) `(:height 0.9 :foreground ,(face-attribute 'spaceline-flycheck-warning :foreground)))
((string-match "✖ [0-9]" text) `(:height 0.9 :foreground ,(face-attribute 'spaceline-flycheck-error :foreground)))
((string-match "✖ Disabled" text) `(:height 0.9 :foreground ,(face-attribute 'font-lock-comment-face :foreground)))
(t '(:height 0.9 :inherit)))))
(propertize (format "%s" text)
'face f
'help-echo "Show Flycheck Errors"
'display '(raise 0.2)
'mouse-face '(:box 1)
'local-map (make-mode-line-mouse-map 'mouse-1 (lambda () (interactive) (flycheck-list-errors)))))
:when active :tight t )
(defvar spaceline--upgrades nil)
(defun spaceline--count-upgrades ()
"Function to count the number of package upgrades needed."
(let ((buf (current-buffer)))
(package-list-packages-no-fetch)
(with-current-buffer "*Packages*"
(setq spaceline--upgrades (length (package-menu--find-upgrades))))
(switch-to-buffer buf)))
(advice-add 'package-menu-execute :after 'spaceline--count-upgrades)
(spaceline-define-segment
ati-package-updates "An `all-the-icons' spaceline segment to indicate number of package updates needed"
(let ((num (or spaceline--upgrades (spaceline--count-upgrades))))
(propertize
(concat
(propertize (format "%s" (all-the-icons-octicon "package"))
'face `(:family ,(all-the-icons-octicon-family) :height 1.1 :inherit)
'display '(raise 0.1))
(propertize (format " %d updates " num) 'face `(:height 0.9 :inherit) 'display '(raise 0.2)))
'help-echo "Open Packages Menu"
'mouse-face '(:box 1)
'local-map (make-mode-line-mouse-map
'mouse-1 (lambda () (interactive) (package-list-packages)))))
:when (and active (> (or spaceline--upgrades (spaceline--count-upgrades)) 0)))
;;---------------------;;
;; Right First Segment ;;
;;---------------------;;
(defun spaceline--get-temp ()
"Function to return the Temperature formatted for ATI Spacline."
(let ((temp (yahoo-weather-info-format yahoo-weather-info "%(temperature)")))
(unless (string= "" temp) (format "%s°C" (round (string-to-number temp))))))
(spaceline-define-segment
ati-weather "Weather"
(let* ((weather (yahoo-weather-info-format yahoo-weather-info "%(weather)"))
(temp (spaceline--get-temp))
(help (concat "Weather is '" weather "' and the temperature is " temp))
(icon (all-the-icons-icon-for-weather (downcase weather))))
(concat
(if (> (length icon) 1)
(propertize icon 'help-echo help 'face `(:height 0.9 :inherit) 'display '(raise 0.1))
(propertize icon
'help-echo help
'face `(:height 0.9 :family ,(all-the-icons-wicon-family) :inherit)
'display '(raise 0.0)))
(propertize " " 'help-echo help)
(propertize (spaceline--get-temp) 'face '(:height 0.9 :inherit) 'help-echo help)))
:when (and active (boundp 'yahoo-weather-info) yahoo-weather-mode)
:enabled nil
:tight t)
(spaceline-define-segment
ati-suntime "Suntime"
(let ((help (yahoo-weather-info-format yahoo-weather-info "Sunrise at %(sunrise-time), Sunset at %(sunset-time)")))
(concat
(propertize (yahoo-weather-info-format yahoo-weather-info "%(sunrise-time) ")
'face '(:height 0.9 :inherit) 'display '(raise 0.1) 'help-echo help)
(propertize (format "%s" (all-the-icons-wicon "sunrise" :v-adjust 0.1))
'face `(:height 0.8 :family ,(all-the-icons-wicon-family) :inherit) 'help-echo help)
(propertize " · " 'help-echo help)
(propertize (yahoo-weather-info-format yahoo-weather-info "%(sunset-time) ")
'face '(:height 0.9 :inherit) 'display '(raise 0.1) 'help-echo help)
(propertize (format "%s" (all-the-icons-wicon "sunset" :v-adjust 0.1))
'face `(:height 0.8 :family ,(all-the-icons-wicon-family) :inherit) 'help-echo help)))
:when (and active (boundp 'yahoo-weather-info) yahoo-weather-mode)
:enabled nil
:tight t )
(spaceline-define-segment
ati-time "Time"
(let* ((hour (string-to-number (format-time-string "%I")))
(icon (all-the-icons-wicon (format "time-%s" hour) :v-adjust 0.0)))
(concat
(propertize (format-time-string "%H:%M ") 'face `(:height 0.9 :inherit) 'display '(raise 0.1))
(propertize (format "%s" icon)
'face `(:height 0.8 :family ,(all-the-icons-wicon-family) :inherit)
'display '(raise 0.1))))
:tight t)
(spaceline-define-segment
ati-height-modifier "Modifies the height of inactive buffers"
(propertize " " 'face '(:height 1.3 :inherit))
:tight t :when (not active))
(spaceline-define-segment
ati-buffer-size "Buffer Size"
(propertize (format-mode-line "%I") 'face `(:height 0.9 :inherit) 'display '(raise 0.1))
:tight t)
(spaceline-define-segment
ati-battery-status "Show battery information"
(let* ((charging? (equal "AC" (cdr (assoc ?L fancy-battery-last-status))))
(percentage (string-to-int (cdr (assoc ?p fancy-battery-last-status))))
(time (format "%s" (cdr (assoc ?t fancy-battery-last-status))))
(icon-set (if charging? 'alltheicon 'faicon))
(icon-alist
(cond
(charging? '((icon . "charging") (inherit . success) (height . 1.3) (raise . -0.1)))
((> percentage 95) '((icon . "full") (inherit . success)))
((> percentage 70) '((icon . "three-quarters")))
((> percentage 35) '((icon . "half")))
((> percentage 15) '((icon . "quarter") (inherit . warning)))
(t '((icon . "empty") (inherit . error)))))
(icon-f (all-the-icons--function-name icon-set))
(family (funcall (all-the-icons--family-name icon-set))))
(let-alist icon-alist
(concat
(if .inherit
(let ((fg (face-attribute .inherit :foreground)))
(propertize (funcall icon-f (format "battery-%s" .icon))
'face `(:height ,(or .height 1.0) :family ,family :foreground ,fg)
'display `(raise ,(or .raise 0.0))))
(propertize (funcall icon-f (format "battery-%s" .icon))
'face `(:family ,family :inherit)
'display '(raise 0.0)))
" "
(if .inherit
(let ((fg (face-attribute .inherit :foreground)))
(propertize (if charging? (format "%s%%%%" percentage) time) 'face `(:height 0.9 :foreground ,fg)))
(propertize time 'face '(:height 0.9 :inherit)))
)))
:global-override fancy-battery-mode-line :when (and active (fboundp 'fancy-battery-mode) fancy-battery-mode))
(defun spaceline--direction (dir)
"Inverts DIR from right to left & vice versa."
(if spaceline-invert-direction (if (equal dir "right") "left" "right") dir))
(defun spaceline--separator-type ()
"Static function to return the separator type."
spaceline-separator-type)
(defmacro define-separator (name dir start-face end-face &optional invert)
"Macro to defined a NAME separator in DIR direction.
Provide the START-FACE and END-FACE to describe the way it should
fade between segmeents. When INVERT is non-nil, it will invert
the directions of the separator."
`(progn
(spaceline-define-segment
,(intern (format "ati-%s-separator" name))
(let ((dir (if spaceline-invert-direction (spaceline--direction ,dir) ,dir))
(sep (spaceline--separator-type)))
(propertize (all-the-icons-alltheicon (format "%s-%s" sep dir) :v-adjust 0.0)
'face `(:height 1.5
:family
,(all-the-icons-alltheicon-family)
:foreground
,(face-attribute ,start-face :background)
:background
,(face-attribute ,end-face :background))))
:skip-alternate t :tight t :when (if ,invert (not active) active))))
(defvar spaceline-invert-direction t)
(defvar spaceline-separator-type "slant")
(define-separator "left-inactive" "right" 'powerline-inactive1 'powerline-inactive2 t)
(define-separator "right-inactive" "left" 'powerline-inactive2 'mode-line-inactive t)
(define-separator "left-1" "right" 'spaceline-highlight-face 'powerline-active1)
(define-separator "left-2" "right" 'powerline-active1 'spaceline-highlight-face)
(define-separator "left-3" "right" 'spaceline-highlight-face 'mode-line)
(define-separator "left-4" "right" 'mode-line 'powerline-active2)
(define-separator "right-1" "left" 'powerline-active2 'powerline-active1)
(define-separator "right-2" "left" 'powerline-active1 'mode-line)
(spaceline-compile
"ati"
'(
((ati-modified ati-window-numbering ati-buffer-size) :face highlight-face :skip-alternate t)
;; left-active-3
ati-left-1-separator
((ati-projectile ati-mode-icon ati-buffer-id) :face default-face)
ati-left-2-separator
((ati-process ati-position ati-region-info) :face highlight-face :separator " | ")
ati-left-3-separator
ati-left-inactive-separator
((ati-vc-icon ati-flycheck-status ati-package-updates purpose) :separator " · " :face other-face)
ati-left-4-separator)
'(ati-right-1-separator
((ati-suntime ati-weather) :separator " · " :face other-face)
ati-right-2-separator
ati-right-inactive-separator
((ati-battery-status ati-time) :separator " | " :face other-face)
))
;; (setq mode-line-format '("%e" (:eval (spaceline-ml-main))))
(provide 'spaceline-all-the-icons)
;;; spaceline-all-the-icons.el ends here
;; Local Variables:
;; indent-tabs-mode: nil
;; End:
Once you have the package installed, you can use it with the following
snippet in your init.el
. I
use use-package
and would
highly recommend you do the same!
(use-package spaceline-all-the-icons :after spaceline
:load-path "path/to/spaceline-all-the-icons")
(use-package spaceline :after powerline
:config (setq-default mode-line-format '("%e" (:eval (spaceline-ml-ati)))))
I intend to make a separate package for this code to complement Spaceline, but in the mean time feel free to use the snippets here and raise an issue if you find any problems.