I like my bash prompt:
to include the current Mercurial/Git branch if applicable – otherwise I would quickly get in big trouble with committing things to the wrong branch in Django etc.
to show the full current working directory - for similar reasons to above, as I often end up lost in a maze of twisty little directories, all alike.
to be always instantaneous (tricky, when 'hg branch' can take up to a second on a bad day due to startup time)
to work well with virtualenv (which adds the environment name to the beginning of the prompt)
to show the time (so that if I have a long running job that I didn't realise was going to be long running, all the info is there to find out how long it took).
to do all the above without confusing me!
All of these together mean I need two lines, but this has advantages - it means the commands I type always start at the same column. I achieve (1) by a bash function that looks for .hg or .git recursively, and looks for '.hg/branch' where applicable. I achieve (6) by using some colours distinguish the different bits.
The end product looks like this - first without a virtualenv, then with:
The code looks like this (in ~/.bashrc)
# Prints " $branchname" if in a hg or git repo, otherwise nothing. print_branch_name() { if [ -z "$1" ] then curdir=`pwd` else curdir=$1 fi if [ -d "$curdir/.hg" ] then echo -n " " if [ -f "$curdir/.hg/branch" ] then cat "$curdir/.hg/branch" else echo "default" fi return 0 elif [ -d "$curdir/.git" ] then echo -n " " git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/' fi # Recurse upwards if [ "$curdir" == '/' ] then return 1 else print_branch_name `dirname "$curdir"` fi } e=\\\033 export PS1="\[$e[1;36m\][\u@\h \t]\[$e[1;33m\]\$(print_branch_name) \[$e[0m\]\w\n\[$e[1;37m\]——> \[$e[0m\]"