在bash提示符下设置git状态的颜色

时间:2014-07-19 06:13:01

标签: git bash command-prompt prompt

我正在尝试使用以下脚本设置我的bash提示符。一切正常,但我在Git存储库中打印分支名称的部分以及颜色分支的状态。颜色有些随意,但不用说,如果任何文件未提交,它将是红色,如果文件未分阶段,则为黄色,而对于其他任何文件,则为绿色。它以白色的思想打印出我想要的部分。当我运行脚本的一部分时,在最后,我单独定义$branchStyle,它可以工作,但它不在这里。我做错了什么?

prompt_git() {
  local s=""
  local branchName=""

  # check if the current directory is in a git repository
  if [ $(git rev-parse --is-inside-work-tree &>/dev/null; printf "%s" $?) == 0 ]; then

      # check if the current directory is in .git before running git checks
      if [ "$(git rev-parse --is-inside-git-dir 2> /dev/null)" == "false" ]; then

          # ensure index is up to date
          git update-index --really-refresh  -q &>/dev/null

          # check for uncommitted changes in the index
          if ! $(git diff --quiet --ignore-submodules --cached); then
              s="$s+";
          fi

          # check for unstaged changes
          if ! $(git diff-files --quiet --ignore-submodules --); then
              s="$s!";
          fi

          # check for untracked files
          if [ -n "$(git ls-files --others --exclude-standard)" ]; then
              s="$s?";
          fi

          # check for stashed files
          if $(git rev-parse --verify refs/stash &>/dev/null); then
              s="$s$";
          fi

      fi

      # get the short symbolic ref
      # if HEAD isn't a symbolic ref, get the short SHA
      # otherwise, just give up
      branchName="$(git symbolic-ref --quiet --short HEAD 2> /dev/null || \
                  git rev-parse --short HEAD 2> /dev/null || \
                  printf "(unknown)")"

      [ -n "$s" ] && s=" [$s]"

      printf "%s" "$1$branchName$s"
  else
      return
  fi
}

set_prompts() {

    local bold=$(tput bold)
    local reset=$(tput sgr0)
    local base05=$(tput setaf 188) # light grey
    local base08=$(tput setaf 210) # red
    local base0A=$(tput setaf 221) # yellow
    local base0B=$(tput setaf 114) # green

    if git rev-parse --git-dir >/dev/null 2>&1; then
        # check for uncommitted changes in the index
        if ! git diff-index --quiet --cached HEAD --ignore-submodules -- >&2; then
            branchStyle=$base08
        # check for unstaged changes
        elif ! git diff-files --quiet --ignore-submodules -- >&2; then
            branchStyle=$base0A
        else
            branchStyle=$base0B
        fi
    fi

    PS1+="\$(prompt_git \"$bold$base05 on $branchStyle\")" # git repository details

    export PS1
}

set_prompts
unset set_prompts

2 个答案:

答案 0 :(得分:2)

解决任何问题的一个好方法是将其减少到重现您所看到的问题所需的最小代码段。这使得调试更容易,其他人更容易阅读和解决,并使其他用户可以从中受益。

例如,如果您查看问题,您会看到:

  • 它与prompt_git函数无关:用简单的echo替换它时会发生同样的事情。
  • 它与颜色无关:如果使用普通字符串,也会发生同样的事情。
  • 它与未分级或未分配的文件无关:如果您跳过这些检查,也会发生同样的事情。
  • 它根本与git无关:如果只是比较目录,就会发生同样的事情。

现在我们可以使用一个小代码示例来编写一个问题,该代码样本可以准确显示错误:

  

我希望以下代码在cd /tmp时显示“in / tmp”,但提示仍为空白。为什么不更新?

set_prompts() { 
  message=""
  if [[ $PWD/ == /tmp/* ]]
  then
    message="in /tmp"
  fi
  PS1="\$(echo $message) \$"
}
set_prompts
unset set_prompts

此问题更易于阅读和回答:set_prompts运行一次并计算$message的值,然后取消设置并再也不执行。这就是消息永远不会改变的原因。

要使其正常工作,请确保在每次重新生成提示之前重新运行它。这可以通过PROMPT_COMMAND

完成
set_prompts() { 
  PS1='\u@\h:\w '                 # <-- Reset PS1 before each run
  message=""
  if [[ $PWD/ == /tmp/* ]]
  then
    message="in /tmp"
  fi
  PS1="\$(echo $message) \$"
}    
PROMPT_COMMAND='set_prompts'      # <-- Run function before every prompt

这可以按预期工作,并且可以很容易地适应您实际的长段代码。

答案 1 :(得分:0)

并非所有终端似乎都支持3位数字,但有些仅限于在man terminfo中声明的便携式8种颜色:

Color       #define       Value       RGB
black     COLOR_BLACK       0     0, 0, 0
red       COLOR_RED         1     max,0,0
green     COLOR_GREEN       2     0,max,0
yellow    COLOR_YELLOW      3     max,max,0
blue      COLOR_BLUE        4     0,0,max
magenta   COLOR_MAGENTA     5     max,0,max
cyan      COLOR_CYAN        6     0,max,max
white     COLOR_WHITE       7     max,max,max

所以,我认为你的问题是使用更高的颜色数字。您可以输出终端的颜色表,如下所示:

( x=`tput op` y=`printf %$((${COLUMNS}-6))s`;for i in {0..256};do o=00$i;echo -e ${o:${#o}-3:3} `tput setaf $i;tput setab $i`${y// /=}$x;done; )

来自http://www.commandlinefu.com/commands/view/6533/print-all-256-colors-for-testing-term-or-for-a-quick-reference