Skip to content

Instantly share code, notes, and snippets.

@partkyle
Last active November 8, 2019 00:52
Show Gist options
  • Save partkyle/65430a5f076c71b60008891eea82375b to your computer and use it in GitHub Desktop.
Save partkyle/65430a5f076c71b60008891eea82375b to your computer and use it in GitHub Desktop.
minimal shell setup
# prompt examples:
# [3 jobs master virtualenv] ~/code/myproject/foo
# [1 job my-branch virtualenv] ~/code/bar/
# [virtualenv] ~/code/
# ~
# Very, very fast, only requiring a couple of fork()s (and no forking at all to determine the current git branch)
if [[ "$USER" == "root" ]]
then
export PS1="\e[1;31m\]\u \[\e[1;33m\]\w\[\e[0m\] ";
else
export PS1="\[\e[1;33m\]\w\[\e[0m\] ";
fi
export PROMPT_DIRTRIM=2
# 100% pure Bash (no forking) function to determine the name of the current git branch
gitbranch() {
export GITBRANCH=""
local repo="${_GITBRANCH_LAST_REPO-}"
local gitdir=""
[[ ! -z "$repo" ]] && gitdir="$repo/.git"
# If we don't have a last seen git repo, or we are in a different directory
if [[ -z "$repo" || "$PWD" != "$repo"* || ! -e "$gitdir" ]]; then
# reset repo and gitdir to make sure they don't get set if nothing is found
unset repo gitdir
local cur="$PWD"
while [[ ! -z "$cur" ]]; do
if [[ -e "$cur/.git" ]]; then
repo="$cur"
gitdir="$cur/.git"
break
fi
cur="${cur%/*}"
done
fi
if [[ -z "$gitdir" ]]; then
unset _GITBRANCH_LAST_REPO
return 0
fi
export _GITBRANCH_LAST_REPO="${repo}"
local head=""
local branch=""
read head < "$gitdir/HEAD"
case "$head" in
ref:*)
branch="${head##*/}"
;;
"")
branch=""
;;
*)
branch="d:${head:0:7}"
;;
esac
if [[ -z "$branch" ]]; then
return 0
fi
export GITBRANCH="$branch"
}
PS1_green='\[\e[32m\]'
PS1_blue='\[\e[34m\]'
PS1_reset='\[\e[0m\]'
_mk_prompt() {
# Change the window title of X terminals
case $TERM in
xterm*|rxvt*|Eterm)
echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/$HOME/~}\007"
;;
screen)
echo -ne "\033_${USER}@${HOSTNAME%%.*}:${PWD/$HOME/~}\033\\"
;;
esac
# Un-screw virtualenv stuff
if [[ ! -z "${_OLD_VIRTUAL_PS1-}" ]]; then
export PS1="$_OLD_VIRTUAL_PS1"
unset _OLD_VIRTUAL_PS1
fi
if [[ -z "${_MK_PROMPT_ORIG_PS1-}" ]]; then
export _MK_PROMPT_ORIG_PS1="$PS1"
fi
local prefix=()
local jobcount="$(jobs -p | wc -l)"
if [[ "$jobcount" -gt 0 ]]; then
local job="${jobcount##* } job"
[[ "$jobcount" -gt 1 ]] && job="${job}s"
prefix+=("$job")
fi
gitbranch
if [[ ! -z "$GITBRANCH" ]]; then
prefix+=("${PS1_green}$GITBRANCH${PS1_reset}")
fi
local virtualenv="${VIRTUAL_ENV##*/}"
if [[ ! -z "$virtualenv" ]]; then
prefix+=("${PS1_blue}$virtualenv${PS1_reset}")
fi
PS1="$_MK_PROMPT_ORIG_PS1"
if [[ ! -z "$prefix" ]]; then
PS1="[${prefix[@]}] $PS1"
fi
export PS1
}
export PROMPT_COMMAND=_mk_prompt
set completion-ignore-case On
# Ctrl+Left/Right to move by whole words
"\e[1;5C": forward-word
"\e[1;5D": backward-word
# Ctrl+Backspace/Delete to delete whole words
"\e[3;5~": kill-word
"\C-_": backward-kill-word
# Ctrl+Shift+Backspace/Delete to delete to start/end of the line
"\e[3;6~": kill-line
"\xC2\x9F": backward-kill-line # for UTF-8
#"\x9F": backward-kill-line # for ISO-8859-x
#"\e\C-_": backward-kill-line # for any other charset
# Alt-Backspace for undo
"\e\d": undo
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment