Create an array `_bash_it_library_finalize_hook` and loop at the end of the main `bash_it.sh` to run each element in the array. The purpose here is to run some command after everything else has been loaded. For example, the appearance lib checks for executables for SCM commands, but `$PATH` may be altered after appearance has loaded and therefore some available commands may never be discovered. Therefore, create `_bash_it_appearance_scm_init()` and add it to the hook. It will re-check at end of `bash_it.sh` just before prompt is first displayed.
159 lines
5.1 KiB
Bash
Executable File
159 lines
5.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Initialize Bash It
|
|
BASH_IT_LOG_PREFIX="core: main: "
|
|
|
|
# Only set $BASH_IT if it's not already set
|
|
if [ -z "${BASH_IT:-}" ]; then
|
|
# Setting $BASH to maintain backwards compatibility
|
|
export BASH_IT=$BASH
|
|
BASH="$(bash -c 'echo $BASH')"
|
|
export BASH
|
|
BASH_IT_OLD_BASH_SETUP=true
|
|
fi
|
|
|
|
# Load composure first, so we support function metadata
|
|
# shellcheck disable=SC1090
|
|
source "${BASH_IT}"/vendor/github.com/erichs/composure/composure.sh
|
|
|
|
# Declare our end-of-main finishing hook
|
|
declare -a _bash_it_library_finalize_hook
|
|
|
|
# We need to load logging module early in order to be able to log
|
|
# shellcheck source-path=SCRIPTDIR/lib
|
|
source "${BASH_IT}/lib/log.bash"
|
|
|
|
# We can only log it now
|
|
[ -z "${BASH_IT_OLD_BASH_SETUP:-}" ] || _log_warning "BASH_IT variable not initialized, please upgrade your bash-it version and reinstall it!"
|
|
|
|
# For backwards compatibility, look in old BASH_THEME location
|
|
if [ -z "${BASH_IT_THEME:-}" ]; then
|
|
_log_warning "BASH_IT_THEME variable not initialized, please upgrade your bash-it version and reinstall it!"
|
|
export BASH_IT_THEME="${BASH_THEME:-}"
|
|
unset BASH_THEME
|
|
fi
|
|
|
|
# support 'plumbing' metadata
|
|
cite _about _param _example _group _author _version
|
|
cite about-alias about-plugin about-completion
|
|
|
|
# libraries, but skip appearance (themes) for now
|
|
_log_debug "Loading libraries(except appearance)..."
|
|
LIB="${BASH_IT}/lib/*.bash"
|
|
APPEARANCE_LIB="${BASH_IT}/lib/appearance.bash"
|
|
for _bash_it_config_file in $LIB; do
|
|
if [ "$_bash_it_config_file" != "$APPEARANCE_LIB" ]; then
|
|
filename=${_bash_it_config_file##*/}
|
|
filename=${filename%.bash}
|
|
BASH_IT_LOG_PREFIX="lib: ${filename}: "
|
|
_log_debug "Loading library file..."
|
|
# shellcheck disable=SC1090
|
|
source "$_bash_it_config_file"
|
|
fi
|
|
done
|
|
|
|
# Load vendors
|
|
BASH_IT_LOG_PREFIX="vendor: "
|
|
for _bash_it_vendor_init in "${BASH_IT}"/vendor/init.d/*.bash; do
|
|
_log_debug "Loading \"$(basename "${_bash_it_vendor_init}" .bash)\"..."
|
|
# shellcheck disable=SC1090
|
|
source "${_bash_it_vendor_init}"
|
|
done
|
|
unset _bash_it_vendor_init
|
|
|
|
BASH_IT_LOG_PREFIX="core: main: "
|
|
# Load the global "enabled" directory
|
|
# "family" param is empty so that files get sources in glob order
|
|
# shellcheck source=./scripts/reloader.bash
|
|
source "${BASH_IT}/scripts/reloader.bash"
|
|
|
|
# Load enabled aliases, completion, plugins
|
|
for file_type in "aliases" "plugins" "completion"; do
|
|
# shellcheck source=./scripts/reloader.bash
|
|
source "${BASH_IT}/scripts/reloader.bash" "skip" "$file_type"
|
|
done
|
|
|
|
# Load theme, if a theme was set
|
|
if [[ -n "${BASH_IT_THEME}" ]]; then
|
|
_log_debug "Loading \"${BASH_IT_THEME}\" theme..."
|
|
# Load colors and helpers first so they can be used in base theme
|
|
BASH_IT_LOG_PREFIX="themes: colors: "
|
|
# shellcheck source=./themes/colors.theme.bash
|
|
source "${BASH_IT}/themes/colors.theme.bash"
|
|
BASH_IT_LOG_PREFIX="themes: githelpers: "
|
|
# shellcheck source=./themes/githelpers.theme.bash
|
|
source "${BASH_IT}/themes/githelpers.theme.bash"
|
|
BASH_IT_LOG_PREFIX="themes: p4helpers: "
|
|
# shellcheck source=./themes/p4helpers.theme.bash
|
|
source "${BASH_IT}/themes/p4helpers.theme.bash"
|
|
BASH_IT_LOG_PREFIX="themes: command_duration: "
|
|
# shellcheck source=./themes/command_duration.theme.bash
|
|
source "${BASH_IT}/themes/command_duration.theme.bash"
|
|
BASH_IT_LOG_PREFIX="themes: base: "
|
|
# shellcheck source=./themes/base.theme.bash
|
|
source "${BASH_IT}/themes/base.theme.bash"
|
|
|
|
BASH_IT_LOG_PREFIX="lib: appearance: "
|
|
# appearance (themes) now, after all dependencies
|
|
# shellcheck source=./lib/appearance.bash
|
|
source "$APPEARANCE_LIB"
|
|
fi
|
|
|
|
BASH_IT_LOG_PREFIX="core: main: "
|
|
_log_debug "Loading custom aliases, completion, plugins..."
|
|
for file_type in "aliases" "completion" "plugins"; do
|
|
if [ -e "${BASH_IT}/${file_type}/custom.${file_type}.bash" ]; then
|
|
BASH_IT_LOG_PREFIX="${file_type}: custom: "
|
|
_log_debug "Loading component..."
|
|
# shellcheck disable=SC1090
|
|
source "${BASH_IT}/${file_type}/custom.${file_type}.bash"
|
|
fi
|
|
done
|
|
|
|
# Custom
|
|
BASH_IT_LOG_PREFIX="core: main: "
|
|
_log_debug "Loading general custom files..."
|
|
CUSTOM="${BASH_IT_CUSTOM:=${BASH_IT}/custom}/*.bash ${BASH_IT_CUSTOM:=${BASH_IT}/custom}/**/*.bash"
|
|
for _bash_it_config_file in $CUSTOM; do
|
|
if [ -e "${_bash_it_config_file}" ]; then
|
|
filename=$(basename "${_bash_it_config_file}")
|
|
filename=${filename%*.bash}
|
|
# shellcheck disable=SC2034
|
|
BASH_IT_LOG_PREFIX="custom: $filename: "
|
|
_log_debug "Loading custom file..."
|
|
# shellcheck disable=SC1090
|
|
source "$_bash_it_config_file"
|
|
fi
|
|
done
|
|
|
|
unset _bash_it_config_file
|
|
if [[ -n "${PROMPT:-}" ]]; then
|
|
export PS1="\[""$PROMPT""\]"
|
|
fi
|
|
|
|
# Adding Support for other OSes
|
|
PREVIEW="less"
|
|
|
|
if [ -s /usr/bin/gloobus-preview ]; then
|
|
PREVIEW="gloobus-preview"
|
|
elif [ -s /Applications/Preview.app ]; then
|
|
# shellcheck disable=SC2034
|
|
PREVIEW="/Applications/Preview.app"
|
|
fi
|
|
|
|
# BASH_IT_RELOAD_LEGACY is set.
|
|
if ! _command_exists reload && [[ -n "${BASH_IT_RELOAD_LEGACY:-}" ]]; then
|
|
case $OSTYPE in
|
|
darwin*)
|
|
alias reload='source ~/.bash_profile'
|
|
;;
|
|
*)
|
|
alias reload='source ~/.bashrc'
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
for _bash_it_library_finalize_f in "${_bash_it_library_finalize_hook[@]:-}"; do
|
|
eval "${_bash_it_library_finalize_f?}" # Use `eval` to achieve the same behavior as `$PROMPT_COMMAND`.
|
|
done
|
|
unset "${!_bash_it_library_finalize_@}"
|