(require 'cl-lib) (require 'package) (defvar +excluded-package-names+ '(tramp-theme color-theme airline-themes)) (defun fussy-string-ends-with (str suffix) (and (< (length suffix) (length str)) (string= suffix (cl-subseq str (- (length str) (length suffix)))))) (defun fussy-is-theme-p (pkg-entry) (let ((name (symbol-name (cl-first pkg-entry)))) (and (or (fussy-string-ends-with name "-theme") (fussy-string-ends-with name "-themes")) (not (cl-member (cl-first pkg-entry) +excluded-package-names+))))) (defun fussy-themes-packages () (cl-remove-if-not 'fussy-is-theme-p package-archive-contents)) (defun fussy-screenshot-svg (filename) "Save a screenshot of the current frame as an SVG image to a file called filename." (let* ((tmpfile (make-temp-file "Emacs" nil ".svg")) (data (x-export-frames nil 'svg))) (with-temp-file tmpfile (insert data)) (copy-file tmpfile filename t))) (defun install-all-themes () (let ((failed-to-install nil)) (cl-dolist (theme (fussy-themes-packages)) (condition-case nil (package-install (cl-first theme)) (error (push (cl-first theme) failed-to-install)))) failed-to-install)) (defun locate-theme-package (theme) "Given a symbol naming a theme, find the name of the package that the theme came from." (let ((theme-file (locate-file (concat (symbol-name theme) "-theme.el") (custom-theme--load-path) '("" "c")))) (string-join (butlast (split-string (second (reverse (file-name-split (file-name-directory theme-file)))) "-")) "-"))) (defun fussy-generate-all-theme-images (&rest files) (let ((failed-to-load nil) (failed-to-generate-image nil) (failed-to-install (install-all-themes))) (message "All themes have been loaded") (cl-dolist (theme (custom-available-themes)) (message (format "Generating for theme: %s" theme)) (unwind-protect (when (condition-case nil (progn (load-theme theme t) t) (error (push theme failed-to-load) (message "... failed to load!") nil)) (dolist (file files) (let* ((theme-package (locate-theme-package theme)) (svg-file (concat (getenv "HOME") "/" theme-package "/" (symbol-name theme) "/" (file-name-base file) "." (file-name-extension file) ".svg"))) (make-directory (file-name-directory svg-file) t) (condition-case nil (progn (find-file file) (delete-other-windows) (fussy-screenshot-svg svg-file)) (error (push (cons theme file) failed-to-generate-image))))))) (disable-theme theme)) (with-temp-file (concat (getenv "HOME") "/" "errors.el") (insert (prin1-to-string (list :load-errors failed-to-load :generation-errors failed-to-generate-image :install-errors failed-to-install)))) (message "FINISHED GENERATING THEME IMAGES"))) (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t) (package-initialize) (package-refresh-contents) (toggle-frame-maximized) (fussy-generate-all-theme-images "/home/colin/projects/LearnCPP/chapter1/hello_world/hello.cpp" "/home/colin/projects/fussy/fussy.el" "/home/colin/projects/INACTIVE/nsa/nsa.py") (kill-emacs)