emacs-prelude/utils/installer.sh
2020-09-16 10:46:00 +03:00

248 lines
8 KiB
Bash
Executable file

install_prelude () {
printf " Cloning Emacs Prelude's GitHub repository...\n$RESET"
if [ x$PRELUDE_VERBOSE != x ]
then
/usr/bin/env git clone $PRELUDE_URL "$PRELUDE_INSTALL_DIR"
else
/usr/bin/env git clone $PRELUDE_URL "$PRELUDE_INSTALL_DIR" > /dev/null
fi
if ! [ $? -eq 0 ]
then
printf "$RED A fatal error occurred during Prelude's installation. Aborting..."
exit 1
fi
}
make_prelude_dirs () {
printf " Creating the required directories.\n$RESET"
mkdir -p "$PRELUDE_INSTALL_DIR/savefile"
}
colors_ () {
case "$SHELL" in
*zsh)
autoload colors && colors
eval RESET='$reset_color'
for COLOR in RED GREEN YELLOW BLUE MAGENTA CYAN BLACK WHITE
do
eval $COLOR='$fg_no_bold[${(L)COLOR}]'
eval B$COLOR='$fg_bold[${(L)COLOR}]'
done
;;
*)
RESET='\e[0m' # Reset
RED='\e[0;31m' # Red
GREEN='\e[0;32m' # Green
YELLOW='\e[0;33m' # Yellow
BLUE='\e[0;34m' # Blue
PURPLE='\e[0;35m' # Magenta
CYAN='\e[0;36m' # Cyan
WHITE='\e[0;37m' # White
BRED='\e[1;31m' # Bold Red
BGREEN='\e[1;32m' # Bold Green
BYELLOW='\e[1;33m' # Bold Yellow
BBLUE='\e[1;34m' # Bold Blue
BPURPLE='\e[1;35m' # Bold Magenta
BCYAN='\e[1;36m' # Bold Cyan
BWHITE='\e[1;37m' # Bold White
;;
esac
}
# Commandline args:
# -d/--directory [dir]
# Install prelude into the specified directory. If 'dir' is a relative path prefix it with $HOME.
# Defaults to '$HOME/.emacs.d'
# -c/--colors
# Enable colors
# -s/--source [url]
# Clone prelude from 'url'.
# Defaults to 'https://github.com/bbatsov/prelude.git'
# -i/--into
# If one exists, install into the existing config
# -n/--no-bytecompile
# Skip the compilation of the prelude files.
# -h/--help
# Print help
# -v/--verbose
# Verbose output, for debugging
usage() {
printf "Usage: $0 [OPTION]\n"
printf " -c, --colors \t \t \t Enable colors.\n"
printf " -d, --directory [dir] \t Install Prelude into the specified directory.\n"
printf " \t \t \t \t If 'dir' is a relative path prefix with $HOME.\n"
printf " \t \t \t \t Defaults to $HOME/.emacs.d\n"
printf " -s, --source [url] \t \t Clone Prelude from 'url'.\n"
printf " \t \t \t \t Defaults to 'https://github.com/bbatsov/prelude.git'.\n"
printf " -n, --no-bytecompile \t \t Skip the bytecompilation step of Prelude.\n"
printf " -i, --into \t \t \t Install Prelude into a subdirectory in the existing configuration\n"
printf " \t \t \t \t The default behavior is to install Prelude into the existing\n"
printf " \t \t \t \t Emacs configuration (.emacs.d).\n"
printf " -h, --help \t \t \t Display this help and exit\n"
printf " -v, --verbose \t \t Display verbose information\n"
printf "\n"
}
### Parse cli
while [ $# -gt 0 ]
do
case $1 in
-d | --directory)
PRELUDE_INSTALL_DIR=$2
shift 2
;;
-c | --colors)
colors_
shift 1
;;
-s | --source)
PRELUDE_URL=$2
shift 2
;;
-i | --into)
PRELUDE_INTO='true'
shift 1
;;
-n | --no-bytecompile)
PRELUDE_SKIP_BC='true'
shift 1
;;
-h | --help)
usage
exit 0
;;
-v | --verbose)
PRELUDE_VERBOSE='true';
shift 1
;;
*)
printf "Unknown option: $1\n"
shift 1
;;
esac
done
VERBOSE_COLOR=$BBLUE
[ -z "$PRELUDE_URL" ] && PRELUDE_URL="https://github.com/bbatsov/prelude.git"
[ -z "$PRELUDE_INSTALL_DIR" ] && PRELUDE_INSTALL_DIR="$HOME/.emacs.d"
if [ x$PRELUDE_VERBOSE != x ]
then
printf "$VERBOSE_COLOR"
printf "PRELUDE_VERBOSE = $PRELUDE_VERBOSE\n"
printf "INSTALL_DIR = $PRELUDE_INSTALL_DIR\n"
printf "SOURCE_URL = $PRELUDE_URL\n"
printf "$RESET"
if [ -n "$PRELUDE_SKIP_BC" ]
then
printf "Skipping bytecompilation.\n"
fi
if [ -n "$PRELUDE_INTO" ]
then
printf "Replacing existing config (if one exists).\n"
fi
printf "$RESET"
fi
# If prelude is already installed
if [ -f "$PRELUDE_INSTALL_DIR/core/prelude-core.el" ]
then
printf "\n\n$BRED"
printf "You already have Prelude installed.$RESET\nYou'll need to remove $PRELUDE_INSTALL_DIR/prelude if you want to install Prelude again.\n"
printf "If you want to update your copy of Prelude, run 'git pull origin master' from your Prelude directory\n\n"
exit 1;
fi
### Check dependencies
printf "$CYAN Checking to see if git is installed... $RESET"
if hash git 2>&-
then
printf "$GREEN found.$RESET\n"
else
printf "$RED not found. Aborting installation!$RESET\n"
exit 1
fi;
printf "$CYAN Checking to see if aspell is installed... "
if hash aspell 2>&-
then
printf "$GREEN found.$RESET\n"
else
printf "$RED not found. Install aspell to benefit from flyspell-mode!$RESET\n"
fi
### Check emacs version
emacs_version="$(emacs --version 2>/dev/null | sed -n 's/.*[^0-9.]\([0-9]*\.[0-9.]*\).*/\1/p;q' | sed 's/\..*//g')"
if [ "${emacs_version:-0}" -lt 25 ]
then
printf "$YELLOW WARNING:$RESET Prelude requires Emacs $RED 25$RESET or newer!\n"
fi
if [ -f "$HOME/.emacs" ]
then
## If $HOME/.emacs exists, emacs ignores prelude's init.el, so remove it
printf " Backing up the existing $HOME/.emacs to $HOME/.emacs.pre-prelude\n"
mv $HOME/.emacs $HOME/.emacs.pre-prelude
fi
if [ -d "$PRELUDE_INSTALL_DIR" ] || [ -f "$PRELUDE_INSTALL_DIR" ]
then
# Existing file/directory found -> backup
printf " Backing up the existing config to $PRELUDE_INSTALL_DIR.pre-prelude.tar.\n"
tar -cf "$PRELUDE_INSTALL_DIR.pre-prelude.tar" "$PRELUDE_INSTALL_DIR" > /dev/null 2>&1
PRELUDE_INSTALL_DIR_ORIG="$PRELUDE_INSTALL_DIR"
# Overwrite existing?
[ -n "$PRELUDE_INTO" ] && PRELUDE_INSTALL_DIR="$PRELUDE_INSTALL_DIR/prelude"
# Clear destination directory for git clone to work
rm -fr "$PRELUDE_INSTALL_DIR"
mkdir "$PRELUDE_INSTALL_DIR"
# Replace existing config
install_prelude
make_prelude_dirs
# Reinstate files that weren't replaced
tar --skip-old-files -xf "$PRELUDE_INSTALL_DIR_ORIG.pre-prelude.tar" "$PRELUDE_INSTALL_DIR" > /dev/null 2>&1
[ -n "$PRELUDE_INTO" ] && cp "$PRELUDE_INSTALL_DIR/sample/prelude-modules.el" "$PRELUDE_INSTALL_DIR/personal"
elif [ -e "$PRELUDE_INSTALL_DIR" ]
then
# File exist but not a regular file or directory
# WTF NOW?
printf "$BRED $PRELUDE_INSTALL_DIR exist but isn't a file or directory.\n"
printf "$BRED please remove this file or install Prelude in a different directory"
printf "$BRED (-d flag)\n$RESET"
exit 1
else
# Nothing yet so just install prelude
install_prelude
make_prelude_dirs
cp "$PRELUDE_INSTALL_DIR/sample/prelude-modules.el" "$PRELUDE_INSTALL_DIR/personal"
fi
if [ -z "$PRELUDE_SKIP_BC" ];
then
if which emacs > /dev/null 2>&1
then
printf " Byte-compiling Prelude...\n"
if [ x$PRELUDE_VERBOSE != x ]
then
emacs -batch -f batch-byte-compile "$PRELUDE_INSTALL_DIR/core"/*.el
else
emacs -batch -f batch-byte-compile "$PRELUDE_INSTALL_DIR/core"/*.el > /dev/null 2>&1
fi
else
printf "$YELLOW Emacs not found.$RESET Skipping byte-compilation.\n"
fi
else
printf "Skipping byte-compilation.\n"
fi
printf "\n"
printf "$BBLUE ____ _ _ \n"
printf "$BBLUE | _ \ _ __ ___| |_ _ __| | ___ \n"
printf "$BBLUE | |_) | __/ _ \ | | | |/ _ |/ _ \ \n"
printf "$BBLUE | __/| | | __/ | |_| | (_| | __/ \n"
printf "$BBLUE |_| |_| \___|_|\__,_|\__,_|\___| \n\n"
printf "$GREEN ... is now installed and ready to do thy bidding, Master $USER!$RESET\n"
printf "$GREEN Don't forget to adjust the modules you want to use in $PRELUDE_INSTALL_DIR/personal/prelude-modules.el!$RESET\n"