You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

213 lines
8.1 KiB

#!/usr/bin/env bash
declare -r XDG_DATA_HOME="${XDG_DATA_HOME:-"$HOME/.local/share"}"
declare -r XDG_CACHE_HOME="${XDG_CACHE_HOME:-"$HOME/.cache"}"
declare -r XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-"$HOME/.config"}"
DOOM_REPO_URL="https://github.com/doom-neovim/doom-nvim"
declare -r DOOM_CONFIG_DIR="${DOOM_CONFIG_DIR:-"$XDG_CONFIG_HOME/nvim"}"
declare BASEDIR
BASEDIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
BASEDIR="$(dirname -- "$(dirname -- "$BASEDIR")")"
readonly BASEDIR
RED=$(tput setaf 1)
YELLOW=$(tput setaf 3)
GREEN=$(tput setaf 2)
NC=$(tput sgr0) # No Color
function help() {
echo "Usage: install.sh [<options>]"
echo "Automatically installs doom-nvim to your machine."
echo ""
echo "Options:"
echo " -h, --help Print this message"
echo " -y, --yes Skip all prompts"
}
declare -a system_dependencies=("nvim" "git" "node" "npm" "fd;optional" "rg;optional" "wget;optional" "unzip;optional")
declare -a npm_dependencies=("tree-sitter")
function banner() {
echo " "
echo "================= =============== =============== ======== ========"
echo "\\\\ . . . . . . .\\\\ //. . . . . . .\\\\ //. . . . . . .\\\\ \\\\. . .\\\\// . . //"
echo "||. . ._____. . .|| ||. . ._____. . .|| ||. . ._____. . .|| || . . .\\/ . . .||"
echo "|| . .|| ||. . || || . .|| ||. . || || . .|| ||. . || ||. . . . . . . ||"
echo "||. . || || . .|| ||. . || || . .|| ||. . || || . .|| || . | . . . . .||"
echo "|| . .|| ||. _-|| ||-_ .|| ||. . || || . .|| ||. _-|| ||-_.|\\ . . . . ||"
echo "||. . || ||-' || || \`-|| || . .|| ||. . || ||-' || || \`|\\_ . .|. .||"
echo "|| . _|| || || || || ||_ . || || . _|| || || || |\\ \`-_/| . ||"
echo "||_-' || .|/ || || \\|. || \`-_|| ||_-' || .|/ || || | \\ / |-_.||"
echo "|| ||_-' || || \`-_|| || || ||_-' || || | \\ / | \`||"
echo "|| \`' || || \`' || || \`' || || | \\ / | ||"
echo "|| .===' \`===. .==='.\`===. .===' /==. | \\/ | ||"
echo "|| .==' \\_|-_ \`===. .===' _|_ \`===. .===' _-|/ \`== \\/ | ||"
echo "|| .==' _-' \`-_ \`=' _-' \`-_ \`=' _-' \`-_ /| \\/ | ||"
echo "|| .==' _-' \`-__\\._-' \`-_./__-' \`' |. /| | ||"
echo "||.==' _-' \`' | /==.||"
echo "==' _-' N E O V I M \\/ \`=="
echo "\\ _-' \`-_ /"
echo " \`'' \`\`' "
}
function executable_exists () {
if ! command -v "$1" &>/dev/null; then
return 0
fi
return 1
}
function check_dependency_group () {
local dependency_group_name=$1
local install_message=$2
shift
shift
echo "Checking $dependency_group_name dependencies..."
local missing_dependencies=0
for i in "$@"; do
# The recommended changes break the string splitting
# shellcheck disable=2206
local split_result=(${i//;/ })
local executable="${split_result[0]}"
local optional=${split_result[1]}
executable_exists "${executable}"
local dependency_status=$?
if [ $dependency_status -eq 1 ]; then
echo "$GREEN [*]$NC Found \"$executable\"."
else
missing_dependencies=1
if [ "$optional" = "optional" ]; then
echo "$YELLOW [ ]$NC Could not find optional dependency \"$executable\"."
else
echo "$RED [ ]$NC Could not find dependency \"$executable\"."
fi
fi
done
if [ $missing_dependencies -eq 1 ]; then
echo "Missing dependencies detected. Optional dependencies can be ignored but may be necessary for some modules."
echo "$install_message"
fi
echo " "
}
function check_doom_installed() {
doom_backed_up=0
if [ -d "${DOOM_CONFIG_DIR}/lua/doom" ]; then
echo "${YELLOW}Warning:$NC Doom nvim is already installed on your system."
echo " "
echo "Do you want to continue installing doom-nvim? (y/n)"
echo "Note: the old config will be backed up to ${XDG_CONFIG_HOME}/doom-nvim-old"
echo ""
read -p "" -n 1 -r
echo " " # (optional) move to a new line
if [[ $REPLY =~ ^[Yy]$ ]]; then
doom_backed_up=1
# If doom-nvim-old directory doesn't exist, move 'nvim/' to 'doom-nvim-old/'
if [ ! -d "${XDG_CONFIG_HOME}/doom-nvim-old" ]; then
mv "${XDG_CONFIG_HOME}/nvim" "${XDG_CONFIG_HOME}/doom-nvim-old"
echo "Moved old config from \`${XDG_CONFIG_HOME}/nvim\` to \`${XDG_CONFIG_HOME}/doom-nvim-old\`"
else
# If it already exists try placing it in 'doom-nvim-old-1/' then 'doom-nvim-old-2' (up until 10)
local i=1
local has_found_directory=0
while [[ $has_found_directory -eq 0 && $i -lt 10 ]]; do
i=$((i+1))
if [ ! -d "${XDG_CONFIG_HOME}/doom-nvim-old-${i}" ]; then
has_found_directory=1
fi
done
if [[ $has_found_directory -eq 1 ]]; then
mv "${XDG_CONFIG_HOME}/nvim" "${XDG_CONFIG_HOME}/doom-nvim-old-${i}"
echo "Moved old config from \`${XDG_CONFIG_HOME}/nvim\` to \`${XDG_CONFIG_HOME}/doom-nvim-old-${i}\`"
fi
fi
fi
fi
echo " "
}
function backup_existing_config() {
if [ -d "$DOOM_CONFIG_DIR" ]; then
echo "${YELLOW}Warning:$NC There is already a config at $DOOM_CONFIG_DIR."
echo " "
echo "Do you want to continue installing doom-nvim? (y/n)"
echo "Note: The old config will be backed up to ${XDG_CONFIG_HOME}/nvim-old"
echo " "
read -p "" -n 1 -r
echo " " # (optional) move to a new line
if [[ $REPLY =~ ^[Yy]$ ]]; then
# If nvim-old directory doesn`t exist, move `nvim/` to `nvim-old/'
if [ ! -d "${XDG_CONFIG_HOME}/nvim-old" ]; then
mv "${XDG_CONFIG_HOME}/nvim" "${XDG_CONFIG_HOME}/nvim-old"
echo "Moved old config from \`${XDG_CONFIG_HOME}/nvim\` to \`${XDG_CONFIG_HOME}/nvim-old\`"
else
# If it already exists try placing it in `nvim-old-1/` then `nvim-old-2/` (up until 10)
local i=1
local has_found_directory=0
while [[ $has_found_directory -eq 0 && $i -lt 10 ]]; do
i=$((i+1))
if [ ! -d "${XDG_CONFIG_HOME}/nvim-old-${i}" ]; then
has_found_directory=1
fi
done
if [[ $has_found_directory -eq 1 ]]; then
mv "${XDG_CONFIG_HOME}/nvim" "${XDG_CONFIG_HOME}/nvim-old-${i}"
echo "Moved old config from \`${XDG_CONFIG_HOME}/nvim\` to \`${XDG_CONFIG_HOME}/nvim-old-${i}\`"
fi
fi
fi
fi
echo " "
}
function install_doom_nvim() {
echo "Cloning..."
git clone "$DOOM_REPO_URL" "${DOOM_CONFIG_DIR}" --depth=10
cd "${DOOM_CONFIG_DIR}" || exit
# Setup user with their own custom branch
git checkout -b my-config
# Checkout the latest version if there are no uncommitted changes
# NOTE: There shouldn't ever be uncommitted changes on a freshly cloned repo
# but I still don't want to risk the possibility of destroying someone's code.
local is_dirty=0
git diff-index --quiet HEAD -- || is_dirty=1;
echo " "
if [ $is_dirty -eq 0 ]; then
local tag
tag="$(git tag -l --sort -version:refname | head -n 1)"
git reset --hard "$tag"
echo "${GREEN}Installed doom-nvim ${tag}!"
else
echo "${GREEN}Installed doom-nvim!"
echo "${YELLOW}Warn: Could not checkout latest tag due to uncommitted changes. \`:DoomUpdate\` command may not work."
fi
}
function main() {
banner
check_dependency_group "system" "Install missing dependencies using your operating system's package manager (brew/pacman/apt-get/dnf/...)." "${system_dependencies[@]}"
check_dependency_group "npm" "Install missing dependencies using npm/yarn/pnpm." "${npm_dependencies[@]}"
check_doom_installed
if [ $doom_backed_up -eq 0 ]; then
backup_existing_config
fi
install_doom_nvim
echo "Run \`nvim\` in your terminal to start doom-nvim."
}
main "$@"