21 декабря 2010

Git branch в zsh prompt

Привет. Работая с git из zsh у вас может возникнуть желание видеть текущий бранч всегда. У меня такое желание возникло. Делается это очень просто, в сети можно легко найти как это сделать. Я представлю свой вариант.

# Это нужно что бы наш prompt заработал.
setopt prompt_subst

# Эти функции нужны нам что бы обновлять текущий бранч.
typeset -ga preexec_functions
typeset -ga precmd_functions
typeset -ga chpwd_functions

# Функция вернет текущий бранч.
get_git_branch () {
    git branch 2>/dev/null | grep -o -P "\*.*$" | sed 's/\* //i'
}

# Эта функция обновит переменную для PROMPT.
update_git_vars () {
    local branch=$(get_git_branch)
    if [ $branch ];
    then
        _GIT_BRANCH="%B(git:%{$fg[blue]%}"$branch"%{$reset_color%}%B)%b⚡"
    else
        _GIT_BRANCH=""
    fi
}

# Это нужно что бы при выполнение команды мы обновляли текущий бранч,
# только если это команда git.
exec_update_git_vars () {
    case "$1" in
        git*)
            _EXEC_GIT_COMMAND=1
            ;;
    esac
}

# В случае если мы выполнили команду git, обновляем статус.
cmd_update_git_vars () {
    if [ -n "$_EXEC_GIT_COMMAND" ]; then
        update_git_vars
        unset _EXEC_GIT_COMMAND
    fi
}

# Эта функция выполняется перед командой введенной в терминале.
preexec_functions+='exec_update_git_vars'
# Это функция после выполнения команды.
precmd_functions+='cmd_update_git_vars'
# Это функция при смене директории.
chpwd_functions+='update_git_vars'

# На случай если мы сразу окажемся в репозитории git.
update_git_vars

# Это вид приглашения для ввода в терминал, если предыдущая команда
# завершилась удачно,
local GOOD="%{$fg[green]%}>%{$reset_color%}"
# и если неудачно.
local BAD="%{$fg[red]%}>%{$reset_color%}"
local PRE_LINE="%B%(?,$GOOD,$BAD)%b "
# А вот и наш PROMPT c _GIT_BRANCH, текущей директорией и с
# приглашением к вводу. Как видите тут используется перенос
# строки для удобства ввода.
PROMPT='$_GIT_BRANCH%B(%{$fg[blue]%}%~%{$reset_color%}%B)%b
$PRE_LINE'
# Тут выводиться время вывода приглашения на ввод. Иногда полезно.
RPROMPT='%{$fg[green]%}%T%{$reset_color%}'

Вот и все. Более интересно решение можно найти тут. Кстати zsh умеет показывать текущий бранч и из коробки, о чем можно прочесть и в документации.