bash提示着色为Mac OS X.

时间:2013-12-30 02:05:28

标签: macos git bash command-prompt

目标

我正在尝试使用git分支(如果可用)在Mac OS X上着色我的bash提示。

我尝试过什么

凭借我有限的bash知识,我将来自Google搜索和其他问题的以下代码拼凑在一起:

function parse_git_branch() {
        branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)

        if [[ -z "$branch" ]]; then
                return
        fi

        if [[ -z "$(git status -s 2>/dev/null)" ]]; then
                color=$'\e[1;32m'
        else
                color=$'\e[1;31m'
        fi

        echo "\[$color\] (${branch}) "
}

PS1="\h:\W \u\$(parse_git_branch)\[\e[0m\]\$ "

问题

在着色工作时,提示符包含parse_git_branch的一些转义序列。

leonidas:AYI jason\[\] (master) $

此外,命令历史记录(向上)和递归搜索(ctrl + r)之类的东西会产生额外的字符。

leonidas:AYI jason\[\] (master) $h)`re': git status

问题

  1. 如何使用适当的可见和不可见字符修复转义。
  2. 我应该使用tput代替这些颜色代码来获得更广泛的支持吗?

2 个答案:

答案 0 :(得分:2)

为什么要解决所有这些麻烦。只需创建一个.bash_profile 我的是: -

export PS1="\[\033[0;30;33m\]\w\[\e[0m\]$ "

您应该设置.bashrc以引用此

[ -r ~/.bash_profile ] && source ~/.bash_profile

答案 1 :(得分:2)

问题是扩展数据中不尊重\[ \]

要解决此问题,您可以在PROMPT_COMMAND中将PS1设置为自身的扩展后版本,其内容将在每次提示之前进行评估:

PROMPT_COMMAND='PS1="\h:\W \u$(parse_git_branch)\[\e[0m\]\\\$ "'

由于\[ \]现在是PS1的字面值的一部分,而不是通过快速扩展创建的,因此它们被正确解释。