Я использую эту функцию в Bash
function parse_git_branch {
git_status="$(git status 2> /dev/null)"
pattern="^# On branch ([^${IFS}]*)"
if [[ ! ${git_status}} =~ "working directory clean" ]]; then
state="*"
fi
# add an else if or two here if you want to get more specific
if [[ ${git_status} =~ ${pattern} ]]; then
branch=${BASH_REMATCH[1]}
echo "(${branch}${state})"
fi
}
но я полон решимости использовать zsh. В то время как я могу использовать это отлично в качестве сценария оболочки (даже без хижины) в моем .zshrc, ошибка является ошибкой анализа на этой строке if [[ ! ${git_status}}
...
Что я должен сделать, чтобы подготовить его к zshell?
Править: "Фактическая ошибка" я добираюсь, " parse error near }
и это относится к строке со странным дважды }}
, который работает над Bash.
Править: Вот заключительный код, только для забавы:
parse_git_branch() {
git_status="$(git status 2> /dev/null)"
pattern="^# On branch ([^[:space:]]*)"
if [[ ! ${git_status} =~ "working directory clean" ]]; then
state="*"
fi
if [[ ${git_status} =~ ${pattern} ]]; then
branch=${match[1]}
echo "(${branch}${state})"
fi
}
setopt PROMPT_SUBST
PROMPT='$PR_GREEN%n@$PR_GREEN%m%u$PR_NO_COLOR:$PR_BLUE%2c$PR_NO_COLOR%(!.#.$)'
RPROMPT='$PR_GREEN$(parse_git_branch)$PR_NO_COLOR'
Благодаря всем для Вашего терпения и справки.
Править: Лучший ответ имеет обученный нас всех: git status
фарфор (UI). Хорошие сценарии против МЕРЗАВЦА, устанавливающего вертикально. Вот заключительная функция:
# The latest version of Chris' function below
PROMPT='$PR_GREEN%n@$PR_GREEN%m%u$PR_NO_COLOR:$PR_BLUE%2c$PR_NO_COLOR%(!.#.$)'
RPROMPT='$PR_GREEN$(parse_git_branch)$PR_NO_COLOR'
Обратите внимание, что только подсказка zsh-конкретна. В Bash это была бы Ваша подсказка плюс "\$(parse_git_branch)"
.
Это могло бы быть медленнее (больше вызовов МЕРЗАВЦУ, но это - эмпирический вопрос), но он не будет поврежден изменениями в МЕРЗАВЦЕ (они не изменяют инфраструктуру). И это очень важно для хорошего продвижения сценария.
Вам действительно следует использовать команды Git для извлечения нужной информации. Вывод «фарфоровых» команд (например, git status
) может со временем меняться, но поведение «сантехнических» команд гораздо более стабильно.
С фарфоровыми интерфейсами это также можно сделать без «bashisms» или «zshisms» (т. Е. Оператора сопоставления = ~
):
parse_git_branch() {
in_wd="$(git rev-parse --is-inside-work-tree 2>/dev/null)" || return
test "$in_wd" = true || return
state=''
git update-index --refresh -q >/dev/null # avoid false positives with diff-index
if git rev-parse --verify HEAD >/dev/null 2>&1; then
git diff-index HEAD --quiet 2>/dev/null || state='*'
else
state='#'
fi
(
d="$(git rev-parse --show-cdup)" &&
cd "$d" &&
test -z "$(git ls-files --others --exclude-standard .)"
) >/dev/null 2>&1 || state="${state}+"
branch="$(git symbolic-ref HEAD 2>/dev/null)"
test -z "$branch" && branch='<detached-HEAD>'
echo "${branch#refs/heads/}${state}"
}
Интеграция вывода в приглашение по-прежнему зависит от оболочки ( т.е. экранировать или заключить в кавычки $
(для bash и zsh ) и установить PROMPT_SUBST (для zsh )).
Если вы получаете сообщение об ошибке не удалось скомпилировать регулярное выражение: недопустимая последовательность байтов
, удалите NULL из IFS. (Замените $ {IFS}
на $ {IFS // $ '\ 0' /}
).
Избавиться от лишних }
? $ {git_status}}
должно быть $ {git_status}
.
После удаления лишнего }
единственная потенциальная проблема, которую я вижу, - это использование $ {BASH_REMATCH [1]}
. Вы можете использовать это в zsh, но для этого необходимо включить эту опцию. Как показано в документации zsh по условным выражениям , вам нужно будет использовать что-то вроде
if [[ ${git_status} =~ ${pattern} ]]; then
branch=${match[1]}
echo "(${branch}${state})"
fi
Возможно, этот репозиторий zsh Git будет содержать тесты, которые могут дать вам некоторую подсказку:
Если вы не хотите изучать zsh, я бы посоветовал вам использовать другой язык, например Python, для такого рода разбора.
Посмотрите git status Python parser и zsh-git-prompt project на github, чтобы узнать, как получить красивую zsh
подсказку для git.
Вы можете использовать массив match
вместо $BASH_REMATCH
. Также можно убрать лишнюю закрывающую фигурную скобку.
Не проверено:
function parse_git_branch {
git_status="$(git status 2> /dev/null)"
pattern="^# On branch ([^${IFS}]*)"
if [[ ! ${git_status}\} =~ "working directory clean" ]]; then
state="*"
fi
# add an else if or two here if you want to get more specific
if [[ ${git_status} =~ ${pattern} ]]; then
branch=${match[1]}
echo "(${branch}${state})"
fi
}
Попробуйте и посмотрите, поможет ли это.