Created
July 16, 2018 22:51
-
-
Save aaronang/f394e86d07911786e16c705f9b74a927 to your computer and use it in GitHub Desktop.
Bash prompt for servers
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
# | |
# Clean and minimalistic Bash prompt | |
# Author: Artem Sapegin, sapegin.me | |
# | |
# Inspired by: https://github.com/sindresorhus/pure & https://github.com/dreadatour/dotfiles/blob/master/.bash_profile | |
# | |
# Notes: | |
# - $local_username - username you don’t want to see in the prompt - can be defined in ~/.bashlocal : `local_username="admin"` | |
# - Colors ($RED, $GREEN) - defined in ../tilde/bash_profile.bash | |
# | |
# User color | |
case $(id -u) in | |
0) user_color="${red}" ;; # root | |
*) user_color="${green}" ;; | |
esac | |
# Symbols | |
prompt_symbol="▲" | |
prompt_clean_symbol="☀ " | |
prompt_dirty_symbol="☂ " | |
prompt_venv_symbol="☁ " | |
function prompt_command() { | |
# Local or SSH session? | |
local remote= | |
[ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ] && remote=1 | |
# Git branch name and work tree status (only when we are inside Git working tree) | |
local git_prompt= | |
if [[ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]]; then | |
# Branch name | |
local branch="$(git symbolic-ref HEAD 2>/dev/null)" | |
branch="${branch##refs/heads/}" | |
# Working tree status (red when dirty) | |
local dirty= | |
# Modified files | |
git diff --no-ext-diff --quiet --exit-code --ignore-submodules 2>/dev/null || dirty=1 | |
# Untracked files | |
[ -z "$dirty" ] && test -n "$(git status --porcelain)" && dirty=1 | |
# Format Git info | |
if [ -n "$dirty" ]; then | |
git_prompt=" ${red}$prompt_dirty_symbol$branch${reset_color}" | |
else | |
git_prompt=" ${green}$prompt_clean_symbol$branch${reset_color}" | |
fi | |
fi | |
# Virtualenv | |
local venv_prompt= | |
if [ -n "$VIRTUAL_ENV" ]; then | |
venv_prompt=" ${blue}$prompt_venv_symbol$(basename $VIRTUAL_ENV)${reset_color}" | |
fi | |
# Only show username if not default | |
local user_prompt= | |
[ "$USER" != "$local_username" ] && user_prompt="$user_color$USER${reset_color}" | |
# Show hostname inside SSH session | |
local host_prompt= | |
[ -n "$remote" ] && host_prompt="@${yellow}$HOSTNAME${reset_color}" | |
# Show delimiter if user or host visible | |
local login_delimiter= | |
[ -n "$user_prompt" ] || [ -n "$host_prompt" ] && login_delimiter=":" | |
# Format prompt | |
first_line="$user_prompt$host_prompt$login_delimiter${white}\w${reset_color}$git_prompt$venv_prompt" | |
# Text (commands) inside \[...\] does not impact line length calculation which fixes stange bug when looking through the history | |
# $? is a status of last command, should be processed every time prompt prints | |
second_line="\`if [ \$? = 0 ]; then echo \[\$CYAN\]; else echo \[\$RED\]; fi\`\$prompt_symbol\[\$NOCOLOR\] " | |
PS1="\n$first_line\n$second_line" | |
# Multiline command | |
PS2="\[$CYAN\]$prompt_symbol\[$NOCOLOR\] " | |
# Terminal title | |
local title="$(basename "$PWD")" | |
[ -n "$remote" ] && title="$title \xE2\x80\x94 $HOSTNAME" | |
echo -ne "\033]0;$title"; echo -ne "\007" | |
} | |
# Show awesome prompt only if Git is istalled | |
command -v git >/dev/null 2>&1 && PROMPT_COMMAND=prompt_command |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment