Bash right prompt
I switched to i3 recently and therefor reconfigured my whole system in manner of apperance. I really like it now, as it uses grey as basic color. Everything is grey: My terminal (xterm, bash), my editor (vim), my IRC client (irssi), my music player (ncmpcpp). But what I like most by far, is my prompt.
Bash it to the right
I always hated the flutter of my bash prompt when diving into directories:
~ $ cd foo ~/foo & cd bar ~/foo/bar $ cd ~ $
But now, I finally reconfigured it to be in a straigt line:
:> | cd foo :> | cd bar :> | cd
And the path is now on the right side (I can't show it in the example, unfortunately).
There is not much magic in it... but let me show you:
The magic
The PS1
variable is the one shelter for the prompt. I configured it to be just
:> |
but if the last command failed, it uses the sad smilie:
:< |
(you can do this with Unicode smilies as well!) There is not much magic in it. The pipe symbol is a Unicode character (\u2502) for me, so I get a straight line without gaps between the lines.
The real magic comes now! There is also a bash variable for a command which gets executed for a prompt. And I abuse this variable a little bit. But first, we have to write the command (actually a bash function):
rightpromptstring() { local tmp=$? local dirty=$([[ $(git diff —shortstat 2>/dev/null | tail -n 1) != “” ]] && echo “ “) local g=$([[ $(git branch 2>/dev/null) ]] && echo “ ($(git name-rev HEAD | cut -d ” “ -f 2)) “) local p=$(pwd | sed “s:^$HOME:~:“) local j=$(jobs | wc -l) local d=$(date +%H:%M) local r=$(echo -n “\u2502 \033[1;30m<<$dirty$g$p [$j] [$d]\033[0m”) local rl=${#r} local t=$(tput cols) let “p = $t – $rl” printf -v sp “%s” $p ' ' echo -ne “$sp$r\r” return $tmp }
So, what happens in here? The first line is for saving the return value of the
previous command. We need it to be returned lateron, as the smilie from PS1
won't work if we don't return it.
The next few lines do a bit of git magic, to include the current branch and a
asterisk if the repository is “dirty”. The variable p
gets the path, but if
I'm in my home directory, it gets replaced by the tilde. The j
variable gets
the number of jobs in the bash, as I always want this to be printed somewhere.
The d
gets the current time.
The r
variable now gets the string which represents the right prompt. It also
gets the pipe character (actually the Unicode character \u2502) and some color
stuff. Then, the rl
variable gets the length of the string in r
. The t
variable gets the number of colums, which is required for printing spaces until
we are at the right side (the printf
part prints spaces to the variable sp
).
Then, the spaces and the right prompt get printed. And then simply a \r
for
carriage-return.
Afterwards we return the stored exit code of the application which just exited and that's it.
Now, just set the prompt command variable:
PROMTP_COMMAND=rightpromptstring
And that's it.
I know, the rightpromptstring
function is a bit ugly and I bet it can be
improved, but it works very good for me! Feel free to send me patches!
tags: #bash #programming #linux