2024-01-06 14:08:11 +00:00
|
|
|
# If not running interactively, don't do anything
|
2024-01-06 14:31:03 +00:00
|
|
|
if ! echo $- | grep 'i' > /dev/null; then
|
|
|
|
return
|
|
|
|
fi
|
2024-01-06 14:08:11 +00:00
|
|
|
|
|
|
|
is_ssh() {
|
|
|
|
if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_CONNECTION" ] || [ -n "$SSH_TTY" ]; then
|
|
|
|
return 0
|
|
|
|
else
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2024-02-16 21:02:12 +00:00
|
|
|
# The shell might not start in the home directory.
|
2024-04-02 12:19:52 +00:00
|
|
|
if [ "$(pwd)" = "/" ]; then
|
|
|
|
cd "$HOME"
|
|
|
|
fi
|
2024-02-16 21:02:12 +00:00
|
|
|
|
2024-01-06 14:08:11 +00:00
|
|
|
# Signal to some programs that vi is the editor that should be launched.
|
2024-03-16 14:51:44 +00:00
|
|
|
export EDITOR=nvim
|
2024-01-06 14:08:11 +00:00
|
|
|
|
|
|
|
# Set shell keybindings to vi
|
|
|
|
set -o vi
|
|
|
|
|
|
|
|
#
|
|
|
|
# The dotfile directory; used by sd()
|
|
|
|
#
|
|
|
|
export DOTDIR="$HOME/Dotfiles"
|
|
|
|
|
|
|
|
#
|
|
|
|
# Local user software. Add software to the software directory
|
|
|
|
# and its bin directory will be automatically loaded when a shell
|
|
|
|
# is launched.
|
|
|
|
#
|
|
|
|
SOFTWARE="$HOME/Software"
|
|
|
|
|
|
|
|
# Add some extra directories to the PATH
|
|
|
|
PATH="$HOME/bin:$PATH"
|
|
|
|
export PATH HOME TERM
|
|
|
|
|
|
|
|
# Store the original path because if scansoft is called, it rebuilds
|
|
|
|
# the path, starting with the original path.
|
|
|
|
PATH_BAK="$PATH"
|
|
|
|
|
|
|
|
available() {
|
|
|
|
type $1 > /dev/null 2>&1
|
|
|
|
return $?
|
|
|
|
}
|
|
|
|
|
|
|
|
scansoft() {
|
|
|
|
PATH="$PATH_BAK"
|
|
|
|
if [ ! -d "$SOFTWARE" ]; then
|
|
|
|
mkdir -p "$SOFTWARE"
|
|
|
|
else
|
|
|
|
# Sort -n to sort entries numerically (to allow precedence)
|
|
|
|
for D in `find "$SOFTWARE" -maxdepth 1 -type d | sort -n`; do
|
|
|
|
if [ -d "$D/bin" ]; then
|
|
|
|
echo "Include '$(basename $D)'"
|
|
|
|
export PATH="$D/bin:$PATH"
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
ensoft() {
|
|
|
|
if [ -z "$1" ]; then
|
|
|
|
echo "Usage: ensoft <dir>"
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
if [ -d "$SOFTWARE/$1" ]; then
|
|
|
|
if [ -d "$SOFTWARE/$1/_bin" ]; then
|
|
|
|
echo "Enabling '$1'..."
|
|
|
|
mv "$SOFTWARE/$1/_bin" "$SOFTWARE/$1/bin"
|
|
|
|
echo "Enabled. Run 'scansoft' to apply changes."
|
|
|
|
elif [ -d "$SOFTWARE/$1/bin" ]; then
|
|
|
|
echo "Already enabled."
|
|
|
|
else
|
|
|
|
echo "'$1' exists, but is not a software directory."
|
|
|
|
fi
|
|
|
|
else
|
|
|
|
echo "'$1' does not exist in the software directory."
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
disoft() {
|
|
|
|
if [ -z "$1" ]; then
|
|
|
|
echo "Usage: disoft <dir>"
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
if [ -d "$SOFTWARE/$1" ]; then
|
|
|
|
if [ -d "$SOFTWARE/$1/bin" ]; then
|
|
|
|
echo "Disabling '$1'..."
|
|
|
|
mv "$SOFTWARE/$1/bin" "$SOFTWARE/$1/_bin"
|
|
|
|
echo "Disabled. Run 'scansoft' to apply changes."
|
|
|
|
elif [ -d "$SOFTWARE/$1/_bin" ]; then
|
|
|
|
echo "Already disabled."
|
|
|
|
else
|
|
|
|
echo "'$1' exists, but is not a software directory."
|
|
|
|
fi
|
|
|
|
else
|
|
|
|
echo "'$1' does not exist in the software directory."
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
mod_time() {
|
|
|
|
if [ -n "$1" ] && [ -f "$1" ]; then
|
|
|
|
case "$(uname)" in
|
|
|
|
Linux) stat -c %Y "$1";;
|
|
|
|
*BSD) stat -f %m "$1";;
|
|
|
|
*) echo "0";; # Force compilation every time.
|
|
|
|
esac
|
|
|
|
else
|
|
|
|
echo "0"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
#
|
|
|
|
# Dotfile Syncing - If changes are made to any of my dotfiles in git, they're
|
|
|
|
# synced to the home directory.
|
|
|
|
#
|
|
|
|
|
|
|
|
sd() {
|
|
|
|
if [ -z "$DOTDIR" ]; then
|
|
|
|
echo "sd: No dotfile directory specified. Please define \$DOTDIR."
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ ! -d "$DOTDIR" ]; then
|
|
|
|
echo "sd: The dotfile directory '$DOTDIR' does not exist."
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
find "$DOTDIR" -type f -not -path "$DOTDIR/.git/*" \
|
|
|
|
-not -name '*.md' -not -name '*.swp' \
|
|
|
|
-not -path '*CVS*' -not -name '.#*' \
|
|
|
|
| while IFS= read -r listing; do
|
|
|
|
local="$HOME/$(echo "$listing" | sed "s|$DOTDIR/||g")"
|
|
|
|
docopy=0
|
|
|
|
if [ -f "$local" ]; then
|
|
|
|
diff -N "$listing" "$local" > /dev/null
|
|
|
|
docopy=$?
|
|
|
|
else
|
|
|
|
docopy=1
|
|
|
|
fi
|
|
|
|
if [ $docopy -eq 1 ]; then
|
|
|
|
localmtime=$(mod_time "$local" 2> /dev/null)
|
|
|
|
if [ -z "$localmtime" ]; then
|
|
|
|
localmtime=0
|
|
|
|
fi
|
|
|
|
listingmtime=$(mod_time "$listing" 2> /dev/null)
|
|
|
|
if [ -z "$listingmtime" ]; then
|
|
|
|
listingmtime=0
|
|
|
|
fi
|
|
|
|
if [ $listingmtime -gt $localmtime ]; then
|
|
|
|
dir=$(dirname "$local")
|
|
|
|
if [ ! -d "$dir" ]; then
|
|
|
|
mkdir -p "$dir"
|
|
|
|
echo "Created directory '$dir'."
|
|
|
|
fi
|
|
|
|
cp -v "$listing" "$local"
|
|
|
|
else
|
|
|
|
cp -v "$local" "$listing"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
|
|
|
#
|
|
|
|
# Shell Prompt
|
|
|
|
#
|
|
|
|
|
|
|
|
# ANSI Colors - Used for Prompt
|
|
|
|
ANSI_RESET="\[\033[0m\]" # reset
|
|
|
|
ANSI_HICOLOR="\[\033[1m\]" # hicolor
|
|
|
|
ANSI_UNDERLINE="\[\033[4m\]" # underline
|
|
|
|
ANSI_INVERT="\[\033[7m\]" # inverse background and foreground
|
|
|
|
ANSI_BLACK="\[\033[30m\]" # foreground black
|
|
|
|
ANSI_RED="\[\033[31m\]" # foreground red
|
|
|
|
ANSI_GREEN="\[\033[32m\]" # foreground green
|
|
|
|
ANSI_YELLOW="\[\033[33m\]" # foreground yellow
|
|
|
|
ANSI_BLUE="\[\033[34m\]" # foreground blue
|
|
|
|
ANSI_MAGENTA="\[\033[35m\]" # foreground magenta
|
|
|
|
ANSI_CYAN="\[\033[36m\]" # foreground cyan
|
|
|
|
ANSI_FWHT="\[\033[37m\]" # foreground white
|
|
|
|
ANSI_WHITE="\[\033[40m\]" # background black
|
|
|
|
ANSI_BG_RED="\[\033[41m\]" # background red
|
|
|
|
ANSI_BG_GREEN="\[\033[42m\]" # background green
|
|
|
|
ANSI_BG_YELLOW="\[\033[43m\]" # background yellow
|
|
|
|
ANSI_BG_BLUE="\[\033[44m\]" # background blue
|
|
|
|
ANSI_BG_MAGENTA="\[\033[45m\]" # background magenta
|
|
|
|
ANSI_BG_CYAN="\[\033[46m\]" # background cyan
|
|
|
|
ANSI_BG_WHITE="\[\033[47m\]" # background white
|
|
|
|
|
|
|
|
trim() {
|
|
|
|
awk '{print $1}'
|
|
|
|
}
|
|
|
|
|
|
|
|
generate_prompt() {
|
|
|
|
LAST_EXIT=$?
|
|
|
|
|
|
|
|
printf "\n%s" "$ANSI_HICOLOR"
|
|
|
|
printf "%s " "$(date '+%Y-%m-%d %H:%M')"
|
|
|
|
|
|
|
|
if [ "$(git rev-parse --is-inside-work-tree 2> /dev/null)" = "true" ]; then
|
|
|
|
printf ' %s(%s)' "$ANSI_YELLOW" "$(git rev-parse --abbrev-ref HEAD)"
|
|
|
|
fi
|
|
|
|
|
|
|
|
printf "%s\n" "$ANSI_RESET"
|
|
|
|
|
|
|
|
printf "%s" "$ANSI_GREEN"
|
|
|
|
printf "%s" "$USER"
|
|
|
|
printf "%s" "$ANSI_RESET"
|
|
|
|
|
|
|
|
printf "@"
|
|
|
|
|
|
|
|
printf "%s" "$ANSI_GREEN"
|
|
|
|
printf "%s" "$(hostname -s)"
|
|
|
|
printf "%s" "$ANSI_RESET"
|
|
|
|
|
|
|
|
printf ":"
|
|
|
|
printf "%s" "$ANSI_HICOLOR"
|
|
|
|
|
|
|
|
DIR=$(echo $PWD | sed "s|$HOME|~|g")
|
|
|
|
|
|
|
|
printf "%s" "$DIR"
|
|
|
|
|
|
|
|
printf "%s\n" "$ANSI_RESET"
|
|
|
|
|
|
|
|
if [ "$LAST_EXIT" != "0" ]; then
|
|
|
|
printf "%s(%s)%s " "$ANSI_RED" "$LAST_EXIT" "$ANSI_RESET"
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ "$(whoami)" = "root" ]; then
|
|
|
|
printf "# "
|
|
|
|
else
|
|
|
|
printf "$ "
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
PS1="\$(generate_prompt)"
|
|
|
|
|
|
|
|
#
|
|
|
|
# Startup functions - these are executed on every shell start.
|
|
|
|
#
|
|
|
|
|
2024-01-06 15:00:51 +00:00
|
|
|
# Display a line from the fortunes file.
|
|
|
|
cols=$(stty size | cut -d ' ' -f 2)
|
|
|
|
shuf -n 1 "$HOME/.fortunes" | fold -s -w $(($cols / 2))
|
|
|
|
|
2024-01-06 14:08:11 +00:00
|
|
|
# Run scansoft on shell start
|
|
|
|
scansoft
|
|
|
|
|
|
|
|
if [ -f "$HOME/.aliases" ]; then
|
|
|
|
. "$HOME/.aliases"
|
|
|
|
fi
|
|
|
|
|