Bart's Blog

Now viewing: /zsh-git-branch2

Links

pictures
vimblog source

Search

Bookmarks

Tags

abiword adam apt asm ata audio bash bios board-game boot bug busybox bzr c code conference debian debug desktop devel disk dpkg email firefox font fs fun geode git git scm git-find git-graft go google gpg hardware html inkscape ion3 ipsec irc irssi joke kdb kernel klips kqemu kvm laptop lastfm ldap linux lua lvm mail make meta mouse-free mpd mutt net nfs oclug ogre ols oom openswan opteron osx ottawa perl power pxe qemu raid redhat ruby sbc scm screen script scsi security shell ssh suse svn tags talk thinkpad ubuntu uml unix urxvt usb uzbl vi video vim vimgit virt vpn web weechat wmii wmiirc-lua x x86 x86emu xen xen-box-setup xterm zsh

Posts

[ 20090702113222 ]
Why pick Git?

[ 20090628131255 ]
select loop for X events

[ 20090625181315 ]
portable printf

[ 20090623225800 ]
switching to uzbl

[ 20090622223147 ]
Linux Symposium

[ 20090622214023 ]
bringing git-format-patch to bzr

[ 20090612215638 ]
nfs local caching with fscache and cachefilesd on Lenny

[ 20090610202041 ]
Scott Chacon smacks git around

[ 20090610150039 ]
how would you read a file into an array of lines

[ 20090609215141 ]
libguestfs

[ 20090609000208 ]
tiding up the PATH

[ 20090608232531 ]
only showing relevant messages in mutt by default

[ 20090608010405 ]
git-vim hacking

[ 20090530223801 ]
mark-yank-urls: fix bug allowing shell to interpret the url

[ 20090509212648 ]
wmiirc-lua v0.2.8 release

[ 20090509113125 ]
wmiirc-lua moving to github

[ 20090504101605 ]
two terminals one PWD

[ 20090501172645 ]
splitting files out of a commit

[ 20090409155905 ]
git workflow: git amend

[ 20090401112030 ]
how old are these files in git?

[ 20090330181138 ]
sles 11 on kvm

[ 20090323194942 ]
android true type font

[ 20090322203939 ]
popen with stdin, stdout, and stderr

[ 20090320214228 ]
shrinking URLs

[ 20090304004744 ]
readlater

[ 20081112150409 ]
splitting patches with git

[ 20081011081638 ]
creating busybox symlinks

[ 20081002215121 ]
wmiirc-lua v0.2.5 release

[ 20080916155113 ]
git-svn strangeness

[ 20080915112959 ]
installilng git man pages quickly

[ 20080913112345 ]
wmiirc-lua v0.2.4 release

[ 20080825100454 ]
Kernel Walkthroughs - booting

[ 20080813210205 ]
Linux Kernel Booting

[ 20080719211329 ]
printable OLS/2008 schedule

[ 20080715214447 ]
wmiirc-lua updates

[ 20080713194704 ]
Git Screencast

[ 20080713143429 ]
four steps to reproducible Debian installs

[ 20080705150651 ]
USB2.0 enclosure benchmark

[ 20080703230924 ]
Linux Kernel Walkthroughs posted

[ 20080702113602 ]
Introducing the Ottawa Ruby folks to Git

[ 20080628160732 ]
Authenticating Linux against OSX LDAP directory

[ 20080627142123 ]
Canada Day Events 2008

[ 20080613162541 ]
Linux Kernel Walkthroughs

[ 20080510083828 ]
is my usb device connected to a fast port?

[ 20080509111534 ]
show more git info on zsh prompt

[ 20080430104202 ]
git-vim

[ 20080412100337 ]
color your word

[ 20080404105620 ]
show current git branch on zsh prompt (2)

[ 20080303200359 ]
how to track multiple svn branches in git

[ 20080301134220 ]
fixing X for GeodeLX

[ 20080108002540 ]
kvm nfs hang

[ 20080107160836 ]
screen -c relative path bug

[ 20080105132854 ]
WeeChat spell suggestions

[ 20071219221358 ]
show current git branch in zsh

[ 20071217141037 ]
wmiirc-lua kitchen sink repository

[ 20071212100316 ]
protecting sshd from OOM killer

[ 20071204234232 ]
wmiirc-lua v0.2.1 remembers a bit more

[ 20071013205336 ]
wmiirc-lua v0.2 has suspend and raw modes

[ 20070929112345 ]
wmiirc-lua debianization

[ 20070924104140 ]
zsh tip of the day - global aliases

[ 20070915094213 ]
wmiirc-lua v0.1.1

[ 20070913130838 ]
comparing two directories

[ 20070909204125 ]
git-rebase --interactive

[ 20070908115905 ]
zsh tab completion awesomeness

[ 20070902000736 ]
wmiirc in lua

[ 20070831150306 ]
debugging with -dbg libraries

[ 20070831142646 ]
svn status like output in git

[ 20070829141847 ]
Git Cheat Sheet

[ 20070821142038 ]
switching to abiword

[ 20070811105746 ]
forwarding ssh and X through screen

[ 20070807112531 ]
git-svnup

[ 20070724082355 ]
reducing power consumption

[ 20070722123734 ]
Makefile template

[ 20070722002649 ]
less, colourful

[ 20070719162359 ]
irssi docs

[ 20070716114553 ]
qemu eats up /dev/shm

[ 20070710214512 ]
git-clean in svn land

[ 20070705113139 ]
ipw2200 not working

[ 20070627191916 ]
git slides updated

[ 20070618220649 ]
unpopular debian packages on my system

[ 20070611125852 ]
git-svn with multiple branches

[ 20070517085321 ]
Linus on Git at Google

[ 20070510134551 ]
vim modelines insecure

[ 20070504205042 ]
bios disassembler

[ 20070504124124 ]
dd hex arguments

[ 20070503013555 ]
urxvt mouseless url yanking

[ 20070502211941 ]
gitdiff.vba v2

[ 20070419234350 ]
india

[ 20070418155857 ]
zsh fun

[ 20070418143632 ]
pipe to pastey.net

[ 20070418094151 ]
vimgrep alias

[ 20070416202545 ]
mouse-free

[ 20070406141850 ]
ATA messages via SCSI layer

[ 20070330221019 ]
GITDiff vim plugin

[ 20070329011735 ]
git presentation for OCLUG

[ 20070328123631 ]
fixing vim's [[ and ]] for bad code

[ 20070316092236 ]
pxeboot and nfsroot with debian

[ 20070312134706 ]
etc snapshots with git

[ 20070307004041 ]
remote power switch

[ 20070222215355 ]
klips-less openswan git tree

[ 20070221041316 ]
git caching for v1.5.x

[ 20070218002214 ]
klips loses zlib

[ 20070209172606 ]
vim and linux CodingStyle

[ 20070207205427 ]
my kqemu install

[ 20070204100100 ]
leaner meaner openswan

[ 20070115111917 ]
wmii+ruby xlock action

[ 20070112131252 ]
cloning xterms in wmii+ruby

[ 20070102010551 ]
wmii+ruby talk for OCLUG

[ 20061228220641 ]
dump and restore

[ 20061218100219 ]
C style

[ 20061101002027 ]
fetching all git branches from remote

[ 20061028111607 ]
local caching for git repos

[ 20061020145437 ]
automatic version creation with git

[ 20061018213306 ]
wmii w/ ruby wmiirc

[ 20061018201907 ]
small fonts

[ 20061007151802 ]
google-codesearch from vim

[ 20060928020813 ]
shell commands

[ 20060920093957 ]
letting screen apps use the ssh-agent

[ 20060908223613 ]
mpdscribble stream support

[ 20060907125149 ]
glGo on ubuntu/dapper amd64

[ 20060906163240 ]
lbdb and mutt

[ 20060902145643 ]
vim tutorial

[ 20060902135722 ]
fixing your terminal

[ 20060828124713 ]
apt-get pdiffs

[ 20060824224842 ]
256 colour xterms

[ 20060824152658 ]
dynamic IPcomp

[ 20060824145428 ]
inkscape++

[ 20060818150516 ]
tags/cscope for system headers

[ 20060805131557 ]
opteron 170, part 4

[ 20060805101941 ]
opteron 170, part 3

[ 20060803233234 ]
opteron 170, part 2

[ 20060802210126 ]
opteron 170

[ 20060729144129 ]
OLS keysigning / 2006

[ 20060728105500 ]
git-find findings

[ 20060727162941 ]
starting on git-find

[ 20060727113632 ]
git-graft and git-find brainstorm

[ 20060726224531 ]
pretty function tracing

[ 20060713174723 ]
uml and multiple network segments

[ 20060707182236 ]
lastfm artist and title to clipboard

[ 20060706162256 ]
reverting a git changeset

[ 20060629212003 ]
user #3

[ 20060628083456 ]
firefox crashes with form input

[ 20060612222204 ]
ldap account management

[ 20060612194523 ]
stupid ldap

[ 20060608092157 ]
rpm hell is right

[ 20060605095726 ]
OpenSSH VPNs

[ 20060604114317 ]
Lenovo lost a customer

[ 20060601234010 ]
generating html colourized sourcecode

[ 20060601211716 ]
ion3 greatness and acting on X selections

[ 20060526085644 ]
software RAID10 performance

[ 20060525234148 ]
learning to love git

[ 20060524121638 ]
recent vim7 articles

[ 20060516095748 ]
bootstrapping debian on my sbc

[ 20060428145140 ]
entropy injection

[ 20060423140628 ]
Adam

[ 20060414202507 ]
converting mp3s to CD

[ 20060413232836 ]
secure apt-get

[ 20060412194423 ]
xen domain0 on debian

[ 20060410220525 ]
LVM2 on RAID1 mirror

[ 20060410102824 ]
building a RHEL4 kernel w/ kdb support

[ 20060407230939 ]
xen on debian

[ 20060407230818 ]
Upgraded look

[ 20060330131334 ]
Flattered by a copy

[ 20060328165153 ]
vim7 from source

[ 20060308123539 ]
Perl, Catalyst, CPAN, and Debian

[ 20060308123302 ]
last.fm

[ 20060128124841 ]
carcassonne and zombies

[ 20060120135931 ]
Election Humour

[ 20050925130002 ]
ldap on debian

[ 20040326082602 ]
bash vi editing mode

[ 20040305163216 ]
cool debian tools

...





RSS Feed - Full Content

Valid XHTML 1.0 Transitional

Created with Vim

Created with Perl


show current git branch on zsh prompt (2)

[ link: zsh-git-branch2 | tags: git zsh shell | updated: Sat, 10 May 2008 08:25:24 ]

NOTE: This post has been updated (again).

I previously wrote about showing the git branch name on the zsh prompt. Caio Marcelo pointed out that it didn't work very well because the git branch was being queried before the command was executed, and it should be after to catch git commands that change the branch, like git branch and git checkout.

He was right, here is a repost.

But first, here is what it looks like for me...

    [bart@xenon] cd ~                                                              (~)
    [bart@xenon]                                                                   (~)
    [bart@xenon] cd work/wmii/wmiirc-lua.git                                       (~)
    [bart@xenon]                              (master) -- (~/work/wmii/wmiirc-lua.git)
    [bart@xenon] git checkout foo             (master) -- (~/work/wmii/wmiirc-lua.git)
    Switched to branch "foo"
    [bart@xenon]                                 (foo) -- (~/work/wmii/wmiirc-lua.git)

NOTE that the right-prompt actually disappears after I hit <enter>, but is retained above for demonstration purposes.

Below I break down the configuration which you can put into your $HOME/.zshrc. If you just want to look at files... you can grab them here ...

  • .zshrc - just loads files in $HOME/.zsh.d
  • .zsh.d - zsh config split by topic, of those you want to look at this one:

Here is the setup in detail...

First, you need to tell zsh to execute functions found in some magic arrays on certain events. Each of these is an array of function names. Each function name is executed when zsh performs some action. I put these in .zsh.d/S10_zshopts.

    typeset -ga preexec_functions
    typeset -ga precmd_functions
    typeset -ga chpwd_functions

We will also use the expansions-in-prompt feature:

    setopt prompt_subst

The next section is in .zsh.d/S55_git of my config. I currently only grab the current git branch and store it in $__CURRENT_GIT_BRANCH environment variable. My plan is to grow it to include git-status info, and maybe bisect. Anyway, this is the only variable to initialize.

    export __CURRENT_GIT_BRANCH=
    export __CURRENT_GIT_VARS_INVALID=1

The latter will be set to non-null when we detected that the next command could alter the branch. Here are some functions to operate on the variables:

    zsh_git_invalidate_vars() {
            export __CURRENT_GIT_VARS_INVALID=1
    }
    zsh_git_compute_vars() {
            export __CURRENT_GIT_BRANCH="$(parse_git_branch)"
            export __CURRENT_GIT_VARS_INVALID=
    }

Next is the function that extracts the branch name. I took this verbatim from Corey's blog.

    parse_git_branch() {
            git-branch --no-color 2> /dev/null \
            | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1) -- /'
    }

When the directory changes, we need invalidate the variables:

    chpwd_functions+='zsh_git_chpwd_update_vars'
    zsh_git_chpwd_update_vars() {
            zsh_git_invalidate_vars
    }

Also, when a command is executed, we check if it matches *git* glob and invalidate the variables in that case.

    preexec_functions+='zsh_git_preexec_update_vars'
    zsh_git_preexec_update_vars() {
            case "$(history $HISTCMD)" in 
                    *git*) zsh_git_invalidate_vars ;;
            esac
    }

Finally, we export a function that will be used by the PROMPT. This function will check if the variables are valid, and if so it will update them. The output of this function will be used in the PROMPT.

    get_git_prompt_info() {
            test -n "$__CURRENT_GIT_VARS_INVALID" && zsh_git_compute_vars
            echo $__CURRENT_GIT_BRANCH
    }

The prompt iteself is defined in .zsh.d/S60_prompt. My example is far more complex, but essentially you need to do something like:

    PROMPT='%c$(get_git_prompt_info) %% '

... or this for the right side ...

    RPROMPT='$(get_git_prompt_info)'




Bart Trojanowski
http://www.jukie.net/~bart
bart@jukie.net