Pracując z gitem, często zapominamy na jakiej aktualnie gałęzi (brancha) się znajdujemy, zaś wpisywanie git branch jest po prostu meczące. Oczywiście możemy to obejść jakimś dwuliterowym, zgrabnym aliasem (tutaj artykuł o nich), jednak wygodniej skorzystać z dobrodziejstwa zsh i otrzymać bezpośrednio i automatycznie ładną informację o tym w jakiej gałęzi się znajdujemy, oraz o tym czy nastąpiły jakieś niezatwierdzone zmiany.

Przykłady

Przykład działania informacji w git

Przykład działania informacji w git - zmiana brancha

Przykład działania informacji w git - zaznaczenie istnienia zmian

Konfiguracja

Konfiguracja bazuje na tej z artykułu Floriana Krienera http://kriener.org/articles/2009/06/04/zsh-prompt-magic (strona już niedostępna - kopia na web.archive.org), jednak zaaplikowałem kilka zmian:

  • używanie jedynie prawej strony PROMPTa
  • możliwość działania z (prawie) dowolnym promptem zsh (np. widoczny na zrzutach prompt fire)
  • wyświetlanie tylko kluczowych informacji dla gita (choć całość mechanizmu obsługuje również inne VCSy)

Zmiany umieszczamy w ~/.zshrc

 ################# git prompt ######################

# based on: http://kriener.org/articles/2009/06/04/zsh-prompt-magic

setopt prompt_subst
autoload colors
colors
autoload -Uz vcs_info

# set some colors
for COLOR in RED GREEN YELLOW WHITE BLACK CYAN; do
    eval PR_$COLOR='%{$fg[${(L)COLOR}]%}'
    eval PR_BRIGHT_$COLOR='%{$fg_bold[${(L)COLOR}]%}'
done
PR_RESET="%{${reset_color}%}";

# set formats
# %b - branchname
# %u - unstagedstr (see below)
# %c - stangedstr (see below)
# %a - action (e.g. rebase-i)
# %R - repository path
# %S - path in the repository
FMT_BRANCH="${PR_GREEN}%s::%b%u%c${PR_RESET}" # e.g. master¹²
FMT_ACTION="(${PR_CYAN}%a${PR_RESET}%)"   # e.g. (rebase-i)
FMT_PATH="%R${PR_YELLOW}/%S"              # e.g. ~/repo/subdir

# check-for-changes can be really slow.
# you should disable it, if you work with large repositories
zstyle ':vcs_info:*:prompt:*' check-for-changes true
zstyle ':vcs_info:*:prompt:*' unstagedstr '¹'  # display ¹ if there are unstaged changes
zstyle ':vcs_info:*:prompt:*' stagedstr '²'    # display ² if there are staged changes
zstyle ':vcs_info:*:prompt:*' actionformats "${FMT_BRANCH}${FMT_ACTION}//" "${FMT_PATH}"
zstyle ':vcs_info:*:prompt:*' formats       "${FMT_BRANCH}"              "${FMT_PATH}"
zstyle ':vcs_info:*:prompt:*' nvcsformats   ""                             "%~"


function precmd {
    vcs_info 'prompt'
}

function rprompt {
    local brackets=$1
    local color1=$2
    local color2=$3

    local bracket_open="${color1}${brackets[1]}${PR_RESET}"
    local bracket_close="${color1}${brackets[2]}${PR_RESET}"
    local colon="${color1}:"
    local at="${color1}@${PR_RESET}"

    local user_host="${color2}%n${at}${color2}%m"
    local vcs_cwd='${${vcs_info_msg_1_%%.}/$HOME/~}'
    local cwd="${color2}%B%20<..<${vcs_cwd}%<<%b"
    local inner=""
    local git='$vcs_info_msg_0_'

        RPROMPT="${PR_RESET}${bracket_open}${inner}${git}${bracket_close}${PR_RESET}"
}

rprompt '  ' $BR_BRIGHT_BLACK $PR_WHITE

Cała moja konfiguracja zsh: http://github.com/grizz-pl/zshrc

Inne VCSy

Jak wspominałem, skupiłem się na gitcie, ale vcs_info obsługuje równiez inne systemy kontroli wersji, takie jak:

  • bzr
  • cdv
  • cvs
  • darcs
  • git
  • hg
  • mtn
  • p4
  • svk
  • svn
  • tla

Komentarze

comments powered by Disqus