diff options
Diffstat (limited to 'users/wpcarro/emacs/pkgs/theme')
-rw-r--r-- | users/wpcarro/emacs/pkgs/theme/default.nix | 14 | ||||
-rw-r--r-- | users/wpcarro/emacs/pkgs/theme/theme.el | 78 |
2 files changed, 92 insertions, 0 deletions
diff --git a/users/wpcarro/emacs/pkgs/theme/default.nix b/users/wpcarro/emacs/pkgs/theme/default.nix new file mode 100644 index 000000000000..aea639436961 --- /dev/null +++ b/users/wpcarro/emacs/pkgs/theme/default.nix @@ -0,0 +1,14 @@ +{ pkgs, depot, ... }: + +pkgs.callPackage + ({ emacsPackages }: + emacsPackages.trivialBuild { + pname = "theme"; + version = "1.0.0"; + src = ./theme.el; + packageRequires = + (with depot.users.wpcarro.emacs.pkgs; [ + cycle + ]); + }) +{ } diff --git a/users/wpcarro/emacs/pkgs/theme/theme.el b/users/wpcarro/emacs/pkgs/theme/theme.el new file mode 100644 index 000000000000..32f2c89a4d0b --- /dev/null +++ b/users/wpcarro/emacs/pkgs/theme/theme.el @@ -0,0 +1,78 @@ +;;; theme.el --- Colors and stuff -*- lexical-binding: t -*- + +;; Author: William Carroll <wpcarro@gmail.com> +;; Version: 0.0.1 +;; Package-Requires: ((emacs "24.3")) + +;;; Commentary: +;; +;; Cycle through a whitelist of themes. + +;;; Code: + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Dependencies +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(require 'cycle) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Library +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defgroup theme nil + "Customization options for `theme'." + :group 'theme) + +(defcustom theme-whitelist + (cycle-from-list (custom-available-themes)) + "The whitelist of themes through which to cycle." + :type '(cycle symbol) + :group 'theme) + +(defcustom theme-after-change + nil + "Hook invoked after a new theme is loaded" + :type 'hook + :group 'theme) + +(defun theme-whitelist-set (theme) + "Focus the THEME in the `theme-whitelist' cycle." + (cycle-focus! (lambda (x) (equal x theme)) theme-whitelist) + (theme--set (cycle-current theme-whitelist))) + +(defun theme-select () + "Load a theme using `completing-read'." + (interactive) + (let ((theme (completing-read "Theme: " (cycle-to-list theme-whitelist)))) + (theme--disable-all) + (theme--set (intern theme)))) + +(defun theme-next () + "Disable the currently active theme and load the next theme." + (interactive) + (disable-theme (cycle-current theme-whitelist)) + (theme--set (cycle-next! theme-whitelist)) + (message (format "Active theme: %s" (cycle-current theme-whitelist)))) + +(defun theme-prev () + "Disable the currently active theme and load the previous theme." + (interactive) + (disable-theme (cycle-current theme-whitelist)) + (theme--set (cycle-prev! theme-whitelist)) + (message (format "Active theme: %s" (cycle-current theme-whitelist)))) + +(defun theme--disable-all () + "Disable all currently enabled themes." + (interactive) + (dolist (x custom-enabled-themes) + (disable-theme x))) + +(defun theme--set (theme) + "Call `load-theme' with `THEME', ensuring that the line numbers are bright. +There is no hook that I'm aware of to handle this more elegantly." + (load-theme theme t) + (run-hooks 'theme-after-change)) + +(provide 'theme) +;;; theme.el ends here |