Jak mogę sprawić, aby Zsh pokazywał, że w repozytorium Git istnieją wersje ukryte, ilekroć się w to wejdę

3

Oto mój bieżący monit:

user@machine ~/Projects/git/repo (git)-[name_of_the_branch] %

Chcę, aby pokazało mi, że istnieją wersje Skrytki poprzez dodanie litery „S”, jak poniżej:

user@machine ~/Projects/git/repo (git)-[name_of_the_branch][S] %

A „S” powinno być zielone :)

Jeszcze lepszym sposobem byłoby dodanie liczby ukrytych wersji.

user@machine ~/Projects/git/repo (git)-[name_of_the_branch][Number_of_stashed_revisions] %

Co muszę zmienić w .zshrc?

To jest mój aktualny plik .zshrc

https://gist.github.com/801944

Nerian
źródło
Łał! Plik rc 4348-liniowy!
Dennis Williamson
@Dennis: Nice eh? jest więcej wierszy w .zshrc_local :) Możesz go używać. To jest wspaniałe.
Nerian

Odpowiedzi:

3

Najpierw musisz zdefiniować funkcję, która będzie testować:

  • Jeśli w ogóle korzystasz z repozytorium git
  • Jeśli są zmiany ukryte

Na szczęście można je połączyć w jedno. Polecenie, którego szukasz, to:

[ "$(git stash list 2>/dev/null)" != "" ]

Jeśli nie ma repozytorium, wówczas sama komenda git stash list wypisuje błąd na standardowy błąd, ale nic na standardowe wyjście (w tym przypadku przypadkowo zwróci kod błędu). Jeśli istnieje repozytorium, nic nie wydrukuje, ale nie wystąpi błąd. Testowanie na pustym łańcuchu obejmuje oba z nich.

Następnie musisz podać to w monicie. Zakładam, że znasz zmienną $ PS1, więc pokażę ci tylko definicję:

PS1='$(if [ "$(git stash list 2>/dev/null)" != "" ]; then echo "[ S ]"; fi)'

Ostatnią częścią jest dodanie koloru. Należy pamiętać, że do terminala dodawany jest kolor, wypisując kody ucieczki. Kody te nie są renderowane, ale cały tekst po nich jest zmieniany. Oznacza to, że nie tylko musisz je włączyć, ale także je wyłączyć. Wreszcie, ponieważ robisz to w trybie szybkim, musisz wskazać, że nie zajmują one miejsca (w przeciwnym razie twój terminal źle się przerysuje podczas przewijania historii).

Definiowanie kolorów odbywa się zwykle za pomocą tego szablonu:

# Try to load colors
autoload colors zsh/terminfo
if [[ "$terminfo[colors]" -ge 8 ]]; then
    colors
fi
for color in RED GREEN YELLOW BLUE MAGENTA CYAN WHITE; do
    eval PR_$color='%{$terminfo[bold]$fg[${(L)color}]%}'
    eval PR_LIGHT_$color='%{$fg[${(L)color}]%}'
done
PR_NO_COLOR="%{$terminfo[sgr0]%}"

Wstaw to do swojego .zshrc przed zdefiniowaniem $ PS1 i możesz odwoływać się do kolorów za pomocą zmiennych o nazwie $ PR_ COLOR-NAME . Aby nie zajmowały miejsca, musisz zawinąć je w % { VAR %} . Oznacza to, że otrzymujesz coś takiego:

PS1='$(if [ "$(git stash list 2>/dev/null)" != "" ]; then echo "%{$PR_GREEN%}[ S ]%{$PR_NO_COLOR%}"; fi)'

Możesz użyć $ PR_LIGHT_GREEN, jeśli wolisz, aby tekst nie był pogrubiony. Sprawdź dostępne wartości w $ terminfo, aby uzyskać więcej efektów tekstowych.

Matthew Franglen
źródło