macOS X 的 bash 提示着色



目标

我正在尝试使用 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) $

此外,命令历史记录 (up) 和递归搜索 (ctrl+r) 等内容会产生额外的字符。

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

问题

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

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

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

您应该设置.bashrc来引用此内容

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

问题是[ ]在扩展数据中没有得到尊重。

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

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

由于[ ]现在是 PS1 文字值的一部分,而不是通过提示扩展创建的,因此可以正确解释它们。

最新更新