#!/bin/bash set -euo pipefail set -x backup-elpa () { ( cd ~/.emacs.d # Make a timestamped snapshot for archival. tar czf elpa.$(date +%F).tgz elpa # Move directory out of Emacs's sight. We could remove it # altogether since we have the archived snapshot; keep it # around for the very minor convenience gain. rm -rf elpa.bkp mv -T elpa elpa.bkp ) } gen-dotemacs () { # --batch will not read my configuration. Fall back to print-like # functions, redirecting to 'external-debugging-output, # redirecting stderr to stdout, and kill-emacs. emacs 2>&1 \ --eval '(pp `(use-package package :custom (package-archives '\''(,@package-archives)) (package-selected-packages '\''(,@package-selected-packages))) '\''external-debugging-output)' \ --funcall kill-emacs } cd ~ gen-dotemacs > .emacs.upgrade backup-elpa mv .emacs .emacs.bkp cp .emacs.upgrade .emacs emacs --funcall package-install-selected-packages mv .emacs.bkp .emacs