yayi C++, python, image processing, hacking, etc

Ugly but useful `PS1` prompt

Forewords

I live in Germany since a bit more than 5 years now. There is something particular in this country that does virtually not exist in France. I believe this something characterizes a lot what German people do, and that can be summarized as the following:

Usefulness justifies everything

For instance, usefulness justifies ugliness. I am good at doing ugly, now I need useful.

PS1 prompt

I use git everyday, in a tmux terminal on OSX, and I've never managed to have git commands completion so far. I was also jaleous from all those people that configured oh my zsh on their computer, such that they have fancy coloring and more things I do not know about.

After some digging:

  • completion can be done by sourcing a file in a vanilla Xcode installation /Applications/Xcode.app/Contents/Developer/usr/share/git-core/git-completion.bash
  • prompt showing additional hint may benefit from the __git_ps1 command that comes also with the git in Xcode installation from the file /Applications/Xcode.app/Contents/Developer/usr/share/git-core/git-prompt.sh
  • coloring the prompt is super easy, according to those color tables

Here is what my .bashrc looks like on my OSX machine :

source /Applications/Xcode.app/Contents/Developer/usr/share/git-core/git-completion.bash
source /Applications/Xcode.app/Contents/Developer/usr/share/git-core/git-prompt.sh

export GIT_PS1_DESCRIBE_STYLE=branch GIT_PS1_SHOWDIRTYSTATE=true GIT_PS1_SHOWUPSTREAM="auto" GIT_PS1_SHOWCOLORHINTS=1
export PS1="\[\e[1m\]\u\[\e[0m\] \[\e[7m\]#\[\e[0m\] \[\e[96m\]\t\[\e[0m\] \[\e[45m\e[1;30m\]\w\[\e[0m\] \[\e[43m\e[30m\]\$(__git_ps1)\[\e[0m\] \[\e[1m\e[31m\]>\[\e[0m\] "

Of course, it did not work out of the box and took me a bit more time than expected to make it work. The important bits were:

  1. every sequence that does not emit a visible output, for instance all formatting/coloring commands, should be wrapped in a group beginning with \[ and ending with \]
  2. every command evaluation like __git_ps1 should be written as \$(__git_ps1), such that it is evaluated every time PS1 needs to be rendered (every new line)

For the first bullet above, it means that if you want to change to color of the foreground and background before a specific placeholder such as \u, you have to use \[\] before the \w (prints current path), example:

\[\e[45m\e[1;30m\]\w\[\e[0m\]

In the above, we see 2 groups: one before and one after the \w, respectiveley \[\e[45m\e[1;30m\] for magenta background+bold+black text, and \[\e[0m\] for resetting all attributes. Not putting things in group would mess up your terminal, in particular you will not be able to see properly previous commands with the up arrow.

Result

Here is what my terminal looks like now

alt text

I haven't lied when I told you I can do ugly...