/dev/null)" pattern="^# -6ren">
gpt4 book ai didi

git - 将 parse_git_branch 函数从 bash 翻译成 zsh(用于提示)

转载 作者:太空狗 更新时间:2023-10-29 12:58:52 26 4
gpt4 key购买 nike

我在 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 中将它完美地用作 shell 脚本(即使没有 shebang),但错误是此行上的解析错误 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)。好的脚本不利于 GIT 管道。这是最终的功能:

# 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 的变化而中断(它们不会改变管道)。这对于一个好的脚本向前发展非常重要。

最佳答案

你真的应该使用 Git “管道”命令来提取你想要的信息。 “porcelain”命令(例如 git status)的输出可能会随时间变化,但“plumbing”命令的行为要稳定得多。

使用陶瓷接口(interface),也可以在没有“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}"
}

将输出集成到提示中仍然是 shell 特定的(即转义或引用 $(对于 bashzsh)并设置PROMPT_SUBST(用于 zsh))。

关于git - 将 parse_git_branch 函数从 bash 翻译成 zsh(用于提示),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2850425/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com