3

Это мое текущее приглашение:

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

Я хочу, чтобы он показал мне, что есть изменения Stash, добавив 'S', например так:

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

И 'S' должно быть зеленым :)

Еще лучшим способом было бы добавить номер спрятанной ревизии.

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

Что мне нужно изменить в .zshrc?

Это мой текущий файл .zshrc

https://gist.github.com/801944

1 ответ1

2

Сначала вам нужно определить функцию, которая будет тестировать:

  • Если вы в git-репо вообще
  • Если есть скрытые изменения

К счастью, эти два могут фактически быть объединены в одно. Команда, которую вы ищете:

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

Если репозитория нет, то сама команда git stash list выведет ошибку к стандартной ошибке, но ничего не стандартизирует (в этом случае она случайно вернет код ошибки). Если есть репо, он ничего не напечатает, кроме ошибки. Таким образом, тестирование на пустую строку охватывает оба из них.

Затем вам нужно вставить это в вашу подсказку. Я предполагаю, что вы знакомы с переменной $ PS1, поэтому я просто покажу вам определение, которое показывает только это:

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

Заключительная часть добавляет цвет. Вы должны знать, что цвет добавляется к вашему терминалу, выписывая escape-коды. Эти коды не отображаются, но весь текст, следующий за ними, изменяется. Это означает, что вам нужно не только включить их, но и отключить их. Наконец, поскольку вы делаете это в приглашении, вам необходимо указать тот факт, что они не занимают места (в противном случае ваш терминал будет плохо перерисовываться при прокрутке истории).

Определение цвета обычно выполняется с помощью этого шаблона:

# 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]%}"

Вставьте это в свой .zshrc до того, как определите $ PS1, и вы сможете ссылаться на цвета, используя переменные с именем $ PR_ COLOR-NAME. Чтобы они не занимали места, вам нужно обернуть их в % { VAR %}. Это означает, что вы получите что-то вроде:

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

Вы можете использовать $ PR_LIGHT_GREEN, если вы предпочитаете, чтобы текст не выделялся жирным шрифтом. Посмотрите доступные значения в $ terminfo для большего количества текстовых эффектов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .