From 5d0150c4d78c23fffc22899d1643acc5e88dd5a5 Mon Sep 17 00:00:00 2001 From: Jannik Zander Date: Mon, 23 May 2016 18:36:23 +0200 Subject: [PATCH] Update PS1 prompt --- .config/profile/rc/prompt.sh | 233 ++++++++++++++++++++++++----------- .profile | 2 +- 2 files changed, 161 insertions(+), 74 deletions(-) diff --git a/.config/profile/rc/prompt.sh b/.config/profile/rc/prompt.sh index 80bb47c..b1d54f8 100644 --- a/.config/profile/rc/prompt.sh +++ b/.config/profile/rc/prompt.sh @@ -1,83 +1,170 @@ -# Bash git prompt solarized +#!/bin/bash -if [ ! -f "${HOME}/.config/profile/rc/git-prompt.sh" ]; then - URL="https://raw.githubusercontent.com/git/git/master/contrib/completion" - curl "${URL}/git-prompt.sh" -L -s -o ~/.config/profile/rc/git-prompt.sh -fi +# bash_prompt -[ -f ${HOME}/.config/profile/rc/git-prompt.sh ] && . ${HOME}/.config/profile/rc/git-prompt.sh +# iTerm2 prefs: import Solarized theme (disable bright colors for bold text) +# Color ref: http://vim.wikia.com/wiki/Xterm256_color_names_for_console_Vim +# More tips: http://www.cyberciti.biz/tips/howto-linux-unix-bash-shell-setup-prompt.html if [[ $COLORTERM = gnome-* && $TERM = xterm ]] && infocmp gnome-256color >/dev/null 2>&1; then - export TERM='gnome-256color'; + export TERM='gnome-256color'; elif infocmp xterm-256color >/dev/null 2>&1; then - export TERM='xterm-256color'; + export TERM='xterm-256color'; fi; -if tput setaf 1 &> /dev/null; then - tput sgr0; # reset colors - bold=$(tput bold); - reset=$(tput sgr0); - black=$(tput setaf 0); - blue=$(tput setaf 33); - cyan=$(tput setaf 37); - green=$(tput setaf 64); - orange=$(tput setaf 166); - purple=$(tput setaf 125); - red=$(tput setaf 124); - violet=$(tput setaf 61); - white=$(tput setaf 15); - yellow=$(tput setaf 136); -else - bold=''; - reset="\e[0m"; - black="\e[1;30m"; - blue="\e[1;34m"; - cyan="\e[1;36m"; - green="\e[1;32m"; - orange="\e[1;33m"; - purple="\e[1;35m"; - red="\e[1;31m"; - violet="\e[1;35m"; - white="\e[1;37m"; - yellow="\e[1;33m"; -fi; +if [ ! -f "${HOME}/.config/profile/rc/git-prompt.sh" ]; then + URL="https://raw.githubusercontent.com/git/git/master/contrib/completion" + curl "${URL}/git-prompt.sh" -L -s -o "${HOME}/.config/profile/rc/git-prompt.sh" +fi -# Highlight the user name when logged in as root. -if [[ "${USER}" == "root" ]]; then - userStyle="${red}"; -else - userStyle="${orange}"; -fi; +if [ -f "${HOME}/.config/profile/rc/git-prompt.sh" ]; then + . ${HOME}/.config/profile/rc/git-prompt.sh + # Enabling any of these options will slow down the prompt + export GIT_PS1_SHOWDIRTYSTATE=1 + export GIT_PS1_SHOWSTASHSTATE=1 + export GIT_PS1_SHOWUNTRACKEDFILES=1 + export GIT_PS1_SHOWUPSTREAM="auto" + export GIT_PS1_STATESEPARATOR=" [" + +fi + +prompt_git() { + local s="" + local branchName="" + + # check if the current directory is in a git repository + if [ $(git rev-parse --is-inside-work-tree &>/dev/null; printf "%s" $?) == 0 ]; then + + # check if the current directory is in .git before running git checks + if [ "$(git rev-parse --is-inside-git-dir 2> /dev/null)" == "false" ]; then + + # ensure index is up to date + git update-index --really-refresh -q &>/dev/null + + # check for uncommitted changes in the index + if ! $(git diff --quiet --ignore-submodules --cached); then + s="$s+"; + fi + + # check for unstaged changes + if ! $(git diff-files --quiet --ignore-submodules --); then + s="$s!"; + fi + + # check for untracked files + if [ -n "$(git ls-files --others --exclude-standard)" ]; then + s="$s?"; + fi + + # check for stashed files + if $(git rev-parse --verify refs/stash &>/dev/null); then + s="$s$"; + fi + + fi + + # get the short symbolic ref + # if HEAD isn't a symbolic ref, get the short SHA + # otherwise, just give up + branchName="$(git symbolic-ref --quiet --short HEAD 2> /dev/null || \ + git rev-parse --short HEAD 2> /dev/null || \ + printf "(unknown)")" + + [ -n "$s" ] && s=" [$s]" + + printf "%s" "$1$branchName$s" + else + return + fi +} + + +set_prompts() { + local black="" + local blue="" + local bold="" + local cyan="" + local green="" + local orange="" + local purple="" + local red="" + local reset="" + local white="" + local yellow="" + + local hostStyle="" + local userStyle="" + + if [ -x /usr/bin/tput ] && tput setaf 1 >& /dev/null; then + bold=$(tput bold) + reset=$(tput sgr0) + + # Solarized colors + # (https://github.com/altercation/solarized/tree/master/iterm2-colors-solarized#the-values) + black=$(tput setaf 0) + blue=$(tput setaf 33) + cyan=$(tput setaf 37) + green=$(tput setaf 64) + orange=$(tput setaf 166) + purple=$(tput setaf 125) + red=$(tput setaf 124) + violet=$(tput setaf 61) + white=$(tput setaf 15) + yellow=$(tput setaf 136) + else + bold="" + reset="\e[0m" + + black="\e[1;30m" + blue="\e[1;34m" + cyan="\e[1;36m" + green="\e[1;32m" + orange="\e[1;33m" + purple="\e[1;35m" + red="\e[1;31m" + violet="\e[1;35m" + white="\e[1;37m" + yellow="\e[1;33m" + fi + + # build the prompt + + # logged in as root + if [[ "$USER" == "root" ]]; then + userStyle="\[$bold$red\]" + else + userStyle="\[$orange\]" + fi + + # connected via ssh + if [[ "$SSH_TTY" ]]; then + hostStyle="\[$bold$red\]" + else + hostStyle="\[$yellow\]" + fi + + # Set the terminal title to the current working directory. + PS1="\[\033]0;\w\007\]" + + PS1+="\n" # newline + PS1+="\[$userStyle\]\u" # username + PS1+="\[$reset$white\] at " + PS1+="\[$hostStyle\]\h" # host + PS1+="\[$reset$white\] in " + PS1+="\[$green\]\w" # working directory + #PS1+="\$(prompt_git \"$white on $cyan\")" # git repository details + PS1+="$(__git_ps1 ' \[${white}\]on \[${cyan}\]%s]')"; # on branch + PS1+="\n" + PS1+="\[$reset$white\]\$ \[$reset\]" # $ (and reset color) + + export PS1 + + PS2="\[${yellow}\]→ " # `→` + PS2+="\[${reset}\]" # reset color + + export PS2; +} -# Highlight the hostname when connected via SSH. -if [[ "${SSH_TTY}" ]]; then - hostStyle="${bold}${red}"; -else - hostStyle="${yellow}"; -fi; -# Enabling any of these options will slow down the prompt -export GIT_PS1_SHOWDIRTYSTATE=1 -export GIT_PS1_SHOWSTASHSTATE=1 -export GIT_PS1_SHOWUNTRACKEDFILES=1 -export GIT_PS1_SHOWUPSTREAM=1 - -# Set git prompt -# Set the terminal title to the current working directory. -PS1='\[\033]0;\w\007\]'; -PS1+='\[${bold}\]'; -PS1+='\r'; # newline -PS1+='\[${userStyle}\]\u '; # username -PS1+='\[${white}\]at '; -PS1+='\[${hostStyle}\]\h '; # at host -PS1+='\[${white}\]in '; -PS1+='\[${green}\]\w '; # in working directory -PS1+="$(__git_ps1 '\[${white}\]on \[${violet}\]%s\[${blue}\]')"; # on branch -PS1+='\n'; # newline -PS1+='\[${white}\]\$ '; # `$` -PS1+='\[${reset}\]'; # reset color -export PS1; - -PS2='\[${yellow}\]→ '; # `→` -PS2+='\[${reset}\]'; # reset color -export PS2; +set_prompts +unset set_prompts diff --git a/.profile b/.profile index 6edc4e0..c1ae363 100644 --- a/.profile +++ b/.profile @@ -12,6 +12,6 @@ if [ -n "${BASH_VERSION}" ]; then fi # set path, environment, prompt etc -for file in ${HOME}/.config/profile/rc/*; do +for file in ${HOME}/.config/profile/rc/*.sh; do [ -f "$file" ] && . "$file"; done; -- 2.43.0