Created
January 1, 2021 11:06
-
-
Save peltho/9d238592c2e321edf59bbb90a8d1afe7 to your computer and use it in GitHub Desktop.
bash prompt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# This prompt inspired by gf3, sindresorhus, alrra, and mathiasbynens. | |
# but customized to me. <3 | |
default_username='thomas' | |
# Colors | |
grey="\033[38;5;248m" | |
red="\033[38;5;196m" | |
orange="\033[38;5;208m" | |
blue="\033[38;5;75m" | |
if [[ -n "$ZSH_VERSION" ]]; then # quit now if in zsh | |
return 1 2> /dev/null || exit 1; | |
fi; | |
if [[ $COLORTERM = gnome-* && $TERM = xterm ]] && infocmp gnome-256color >/dev/null 2>&1; then | |
export TERM=gnome-256color | |
elif infocmp xterm-256color >/dev/null 2>&1; then | |
export TERM=xterm-256color | |
fi | |
set_prompts() { | |
local black="" blue="" bold="" cyan="" green="" orange="" \ | |
purple="" red="" reset="" white="" yellow="" | |
local dateCmd="" | |
bold="" | |
reset="\e[0m" | |
black="\e[1;30m" | |
cyan="\e[1;36m" | |
green="\e[1;32m" | |
orange="\e[1;33m" | |
purple="\e[1;35m" | |
red="\e[1;31m" | |
magenta="\e[1;31m" | |
violet="\e[1;35m" | |
white="\e[1;37m" | |
yellow="\e[1;33m" | |
darkgrey="\033[38;5;238m" | |
grey="\033[38;5;248m" | |
red="\033[38;5;196m" | |
orange="\033[38;5;208m" | |
blue="\033[38;5;75m" | |
green="\033[38;5;76m" | |
# Only show username/host if not default | |
function usernamehost() { | |
# Highlight the user name when logged in as root. | |
if [[ "${USER}" == *"root" ]]; then | |
userStyle="${red}"; | |
else | |
userStyle="${grey}"; | |
fi; | |
userhost="" | |
userhost+="\[${userStyle}\]$USER" | |
userhost+="${darkgrey}@" | |
userhost+="${grey}$HOSTNAME" | |
userhost+="${darkgrey}:" | |
echo $userhost | |
} | |
function prompt_git() { | |
# this is >5x faster than mathias's. | |
# check if we're in a git repo. (fast) | |
git rev-parse --is-inside-work-tree &>/dev/null || return | |
# check for what branch we're on. (fast) | |
# if… HEAD isn’t a symbolic ref (typical branch), | |
# then… get a tracking remote branch or tag | |
# otherwise… get the short SHA for the latest commit | |
# lastly just give up. | |
branchName="$(git symbolic-ref --quiet --short HEAD 2> /dev/null || \ | |
git describe --all --exact-match HEAD 2> /dev/null || \ | |
git rev-parse --short HEAD 2> /dev/null || \ | |
echo '(unknown)')"; | |
# check if it's dirty (slow) | |
# technique via github.com/git/git/blob/355d4e173/contrib/completion/git-prompt.sh#L472-L475 | |
dirty=$(git diff --no-ext-diff --quiet --ignore-submodules --exit-code || echo -e "★") | |
ahaed=$(git st | grep ahead >> /dev/null && echo -e "⬆︎") | |
behind=$(git st | grep behind >> /dev/null && echo -e "⬇︎") | |
# mathias has a few more checks some may like: | |
# github.com/mathiasbynens/dotfiles/blob/a8bd0d4300/.bash_prompt#L30-L43 | |
[ -n "${s}" ] && s=" [${s}]"; | |
echo -e "${1}${branchName}${2}$dirty$unpushed$behind"; | |
return | |
} | |
# ------------------------------------------------------------------ | |
# | Prompt string | | |
# ------------------------------------------------------------------ | |
PS1="\[\033]0;\w\007\]" # terminal title (set to the current working directory) | |
#PS1+="\n\[$bold\]" | |
PS1+="\[$(usernamehost)\]" # username at host | |
PS1+="\[$blue\]\w" # working directory | |
#PS1+="\$(prompt_git \"$darkgrey:$orange\" \"$red\")" # git repository details | |
PS1+="\n" | |
PS1+="\[$reset$white\]\\[$reset\]" | |
export PS1 | |
# ------------------------------------------------------------------ | |
# | Subshell prompt string | | |
# ------------------------------------------------------------------ | |
export PS2="⚡ " | |
# ------------------------------------------------------------------ | |
# | Debug prompt string (when using `set -x`) | | |
# ------------------------------------------------------------------ | |
# When debugging a shell script via `set -x` this tricked-out prompt is used. | |
# The first character (+) is used and repeated for stack depth | |
# Then, we log the current time, filename and line number, followed by function name, followed by actual source line | |
# FWIW, I have spent hours attempting to get time-per-command in here, but it's not possible. ~paul | |
export PS4='+ \011\e[1;30m\t\011\e[1;34m${BASH_SOURCE}\e[0m:\e[1;36m${LINENO}\e[0m \011 ${FUNCNAME[0]:+\e[0;35m${FUNCNAME[0]}\e[1;30m()\e[0m:\011\011 }' | |
# shoutouts: | |
# https://github.com/dholm/dotshell/blob/master/.local/lib/sh/profile.sh is quite nice. | |
# zprof is also hot. | |
} | |
set_prompts | |
unset set_prompts |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment