按下向下箭头时,部分终端线会消失

按下向下箭头时,部分终端线会消失

我使用自定义 PS1 在终端中显示更多相关信息,例如我是否在 git 目录中以及它是否干净或需要提交更改。但是,有时当我使用箭头键浏览命令时,部分终端行会消失:

@ ~/tests/testing [tests] > grunt
# up arrow, down arrow
@ ~/tests/testing [t

本质上,ests] >被切断了,我只剩下[t

使用此 PS1 配置会导致部分线路中断,有什么特殊原因吗?

以下是一些附加信息:

我的 TERM 环境变量是xterm-256color。这是我的.bash_profile

red='\033[0;31m'
yellow='\033[0;32m'
orange='\033[0;33m'
blue='\033[0;34m'
pink='\033[0;35m'
NC='\033[0m'

function is_git {
  if git rev-parse --is-inside-work-tree 2>/dev/null; then
    return 1
  else
    return 0
  fi
}

function stuff {
  if [ $(is_git) ]; then
    git_dir="$(git rev-parse --git-dir 2>/dev/null)"

    if [ -z "$(ls -A ${git_dir}/refs/heads )" ]; then
      echo -en " [${orange}init${NC}]"
      return
    fi

    echo -n " ["
    if [ $(git status --porcelain 2>/dev/null| wc -l | tr -d ' ') -ne 0 ]; then
      echo -en "${red}"
    else
      echo -en "${blue}"
    fi
    echo -en "$(git rev-parse --abbrev-ref HEAD)${NC}]"
  fi
}

export PS1="@ \w\[\$(stuff)\]\[\$(tput sgr0)\] > "

答案1

@i_am_root 建议将\[and放在 and 之类\]的定义中,red这是一个好主意。然而,,bash 仅处理中的\[和,而不处理中包含的文本。因此,在 和 之类的内容内使用and (或and )代替和。\]PS1PS1$()\001\002\x01\x02red\[\]

注:每这个答案,只有转义代码应该在\001and中\002。用户可见的文本应该在\001and之外\002,以便 bash 知道它占用了屏幕空间,并且可以在重新绘制时考虑到这一点。

答案2

Bash 颜色代码、转义字符、赋值等很快就会变得令人困惑。

echo尝试此代码示例,通过添加变量来替换命令PS1

red='\[\033[0;31m\]'
yellow='\[\033[0;32m\]'
orange='\[\033[0;33m\]'
blue='\[\033[0;34m\]'
pink='\[\033[0;35m\]'
NC='\[\033[0m\]'

export PS1="@ \w"

function is_git {
  if git rev-parse --is-inside-work-tree 2>/dev/null; then
    return 1
  else
    return 0
  fi
}

function stuff {
  if [ $(is_git) ]; then
    git_dir="$(git rev-parse --git-dir 2>/dev/null)"

    if [ -z "$(ls -A ${git_dir}/refs/heads )" ]; then
      PS1="${PS1} [${orange}init${NC}]"
      return
    fi

    PS1="$PS1 ["
    if [ $(git status --porcelain 2>/dev/null| wc -l | tr -d ' ') -ne 0 ]; then
      PS1="${PS1}${red}"
    else
      PS1="${PS1}${blue}"
    fi
    PS1="${PS1}$(git rev-parse --abbrev-ref HEAD)${NC}]"
  fi
}

stuff
PS1="${PS1}$(tput sgr0) > "

相关内容