我在OsX上自定义我的bash提示符,包括git branch以及分支状态的一些标记。这打破了换行。
我知道I have to add \[ and \] to prevent this issue,但在函数中这样做会显示\ [和\] litteraly。
我可以做些什么来逃避这些功能中的序列?
免责声明:这是我第一次尝试使用bash脚本。
function parse_git_dirty {
# TODO make git status response a variable
# [branch+] : working dir has staged changes
if [[ $(git status 2> /dev/null | grep "to be committed") ]]
then S=$S"$(tput setaf 2)+$(tput sgr0)"
fi
# [branch+] : working dir has unstaged changes
if [[ $(git status 2> /dev/null | grep "not staged for commit") ]]
then S=$S"$(tput setaf 1)+$(tput sgr0)"
fi
# [branch+] : working dir has untracked files
if [[ $(git status 2> /dev/null | grep "tracked files") ]]
then S=$S"$(tput setaf 1)+$(tput sgr0)"
fi
# [branch<] : local branch is behind origin
if [[ $(git status 2> /dev/null | grep "Your branch is behind") ]]
then S=$S"$(tput setaf 5)<$(tput sgr0)"
fi
# [branch>] : local branch is ahead origin
if [[ $(git status 2> /dev/null | grep "branch is ahead of") ]]
then S=$S"$(tput setaf 5)>$(tput sgr0)"
fi
# [branch<>] : branches have diverged
if [[ $(git status 2> /dev/null | grep "have diverged") ]]
then S=$S"$(tput setaf 5)<>$(tput sgr0)"
fi
echo $S
}
function parse_git_branch {
git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
}
function show_git_branch {
if [[ $(parse_git_branch) ]]
then echo "$(tput setaf 2)($(tput sgr0)$(parse_git_branch)$(parse_git_dirty)$(tput setaf 2))$(tput sgr0)"
fi
}
export PS1="\u\[$(tput setaf 2)\]@\[$(tput sgr0)\]\h\[$(tput setaf 2)\]:\[$(tput sgr0)\]\W\[\$(show_git_branch)\] "
答案 0 :(得分:5)
我很高兴听到您已经解决了您的版本问题,但我认为值得指出git已经通过一个名为__git_ps1
的有用且经过深思熟虑的bash函数分发,您可以包含在PS1
中。例如,您可以像这样使用它:
export PS1='blah blah blah$(__git_ps1 " (%s)") '
如果您不在git存储库中,$(__git_ps1 " (%s)")
将变为空字符串。但是,如果您是,那么将使用格式字符串。这通常会显示您当前的分支,但是如果您正处于合并或者将会显示的rebase的中间。
默认情况下,__git_ps1
不会显示树是否为脏或者有未跟踪的文件,因为在某些存储库中,这可能会使您的bash提示出现非常缓慢。但是,如果您还想查看此信息,则会将GIT_PS1_SHOWDIRTYSTATE
或GIT_PS1_SHOWUNTRACKEDFILES
设置为非空的内容时显示。
答案 1 :(得分:3)
您需要在分配值中使用单引号:
export PS1='\u\[$(tput setaf 2)\]@\[$(tput sgr0)\]\h\[$(tput setaf 2)\]:\[$(tput sgr0)\]\W\[$(show_git_branch)\] '
由于在发出提示时会评估内容,因此您不需要像在其他情况下那样使用双引号。
答案 2 :(得分:1)
感谢Dennis,更正的代码是:
function parse_git_dirty {
# TODO make git status response a variable
# [branch+] : working dir has staged changes
if [[ $(git status 2> /dev/null | grep "to be committed") ]]
then S=$S"$(tput setaf 2)+$(tput sgr0)"
fi
# [branch+] : working dir has unstaged changes
if [[ $(git status 2> /dev/null | grep "not staged for commit") ]]
then S=$S"$(tput setaf 1)+$(tput sgr0)"
fi
# [branch+] : working dir has untracked files
if [[ $(git status 2> /dev/null | grep "tracked files") ]]
then S=$S"$(tput setaf 1)+$(tput sgr0)"
fi
# [branch<] : local branch is behind origin
if [[ $(git status 2> /dev/null | grep "Your branch is behind") ]]
then S=$S"$(tput setaf 5)<$(tput sgr0)"
fi
# [branch>] : local branch is ahead origin
if [[ $(git status 2> /dev/null | grep "branch is ahead of") ]]
then S=$S"$(tput setaf 5)>$(tput sgr0)"
fi
# [branch<>] : branches have diverged
if [[ $(git status 2> /dev/null | grep "have diverged") ]]
then S=$S"$(tput setaf 5)<>$(tput sgr0)"
fi
echo $S
}
function parse_git_branch {
git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
}
function show_git_branch {
if [[ $(parse_git_branch) ]]
then echo "$(tput setaf 2)($(tput sgr0)$(parse_git_branch)$(parse_git_dirty)$(tput setaf 2))$(tput sgr0)"
fi
}
export PS1='\u\[$(tput setaf 2)\]@\[$(tput sgr0)\]\h\[$(tput setaf 2)\]:\[$(tput sgr0)\]\W\[$(show_git_branch)\] '