Set up GNU Screen to show the current Git branch
Git Branch Prompt
Many people have written about showing the current git branch in your shell prompt.
There is even the Bash function __git_ps1 provided in the main Git repo.
I prefer to show info like the current time and current git branch in a GNU screen status line.
Screen Status
As I use screen constantly, I decided to take a different route: put the current branch name in my screen status line.
Changing the Screen Current Directory
When you start screen, it remembers the current directory. Issuing cd
commands inside a shell does not change the value. The only way to change it is to issue a screen
chdir
command.
In order to know the current branch in a particular screen window, I needed to make screen's current directory change to follow the shell it is presenting.
I added the following to my .bashrc
:
function set_screen_path() {
screen -X chdir "`pwd`"
}
case $TERM in
screen*)
PROMPT_COMMAND=set_screen_path
;;
esac
This is Bash specific, but similar code should work in other shells.
git-current-branch
Next, I created the following shell script to get the current Git path:
#!/bin/sh
git branch 2>/dev/null | grep '*' | sed 's/\* //'
.screenrc
And finally, I added a 'backtick' command to my .screenrc
file:
startup_message off
backtick 1 0 1 git-current-branch
hardstatus alwayslastline "%-w%{.bw}%n %t%{-}%+w %-45= %1`"
screen -t bash 0
screen -t edit 1
select 0
The important line is:
backtick 1 0 1 git-current-branch
which creates a 'backtick command' (number 1) which calls git-current-branch
once a second via %1\`
in the hardstatus
line.
The Result

Conclusion
This system is not perfect as the shell only notifies screen of its directory when a new prompt is created.
The result is that if you switch screens, the status line doesn't get updated until after you issue a command.