彩色多行 PS1 无法追踪命令的开头位置

彩色多行 PS1 无法追踪命令的开头位置

我的.bashrc:

export COLOR_RST=$(tput sgr0)
export COLOR_WHI=$(tput setaf 15)$(tput bold)
export COLOR_gra=$(tput setaf 7)
export COLOR_GRA=$(tput setaf 8)$(tput bold)
export COLOR_BLK=$(tput setaf 16)$(tput bold)
export COLOR_red=$(tput setaf 1)
export COLOR_RED=$(tput setaf 9)$(tput bold)
export COLOR_grn=$(tput setaf 2)
export COLOR_GRN=$(tput setaf 10)$(tput bold)
export COLOR_yel=$(tput setaf 3)
export COLOR_YEL=$(tput setaf 11)$(tput bold)
export COLOR_blu=$(tput setaf 4)
export COLOR_BLU=$(tput setaf 12)$(tput bold)
export COLOR_pur=$(tput setaf 5)
export COLOR_PUR=$(tput setaf 13)$(tput bold)
export COLOR_cya=$(tput setaf 6)
export COLOR_CYA=$(tput setaf 14)$(tput bold)

git_branch_info () {
    local _bra="$(git branch 2> /dev/null | grep -e ^* | cut -d\  -f2)"
    local status_por="$(git status --porcelain 2>/dev/null)"
    local _mod="±$(echo -e "$status_por" | grep -E '^( M|M |MM)' | wc -l)"
    local _add="+$(echo -e "$status_por" | grep -E '^( A|A |AA)' | wc -l)"
    local _del="-$(echo -e "$status_por" | grep -E '^( D|D |DD)' | wc -l)"
    local _ren="r$(echo -e "$status_por" | grep -E '^( R|R |RR)' | wc -l)"
    local _unt="?$(echo -e "$status_por" | grep -E '^\?\?' | wc -l)"

    # echo "b=$_bra:m=$_mod:a=$_add:d=$_del:r=$_ren:"
    [[ "$_bra" = '' ]]   && _bra="" || _bra=" ${COLOR_PUR}$_bra"
    [[ "$_mod" = '±0' ]] && _mod="" || _mod=" ${COLOR_YEL}$_mod"
    [[ "$_add" = '+0' ]] && _add="" || _add=" ${COLOR_GRN}$_add"
    [[ "$_del" = '-0' ]] && _del="" || _del=" ${COLOR_RED}$_del"
    [[ "$_ren" = 'r0' ]] && _ren="" || _ren=" ${COLOR_YEL}$_ren"
    [[ "$_unt" = '?0' ]] && _unt="" || _unt=" ${COLOR_GRN}$_unt"

    echo -e "$_bra$_mod$_add$_del$_ren$_unt${COLOR_RST}"

}

color_prompt () {
    if [[ "$USER" = "root" ]]; then
        local lv_col="${COLOR_RED}"
        local lv_sym="#"
    else
        local lv_col="${COLOR_GRN}"
        local lv_sym="$"
    fi

    local usr_host="${lv_col}${USER}${COLOR_GRA}@${COLOR_BLU}\h${COLOR_GRA}:${COLOR_RST}"
    local time="$COLOR_WHI\d \t${COLOR_RST}"
    local curr_path="${COLOR_blu}\w${COLOR_RST}"
    local git='$(git_branch_info)'
    local prompt="${lv_col}${lv_sym} ${COLOR_RST}"

    export PS1="\n$time\n${usr_host}${curr_path}${git}\n${prompt}"
    export PS2="${lv_col}>${COLOR_RST}  "
}
color_prompt

它按预期工作(我得到一个包含三行提示的提示,时钟、路径和命令提示符。颜色看起来不错。

但是,当我输入命令后,点击C-a(返回行首)时,光标不会一直移动到左边:部分命令“卡”在开头,多余的空白处连接到提示符的末尾。这就像光标忘记了命令的位置,并认为它向右移动了。基本上,光标没有任何意义,我需要重新C-c绘制提示符。

阅读Bash:PS1 与 Prompt 命令用于设置提示和标题我更加困惑 PS1 版本的方法是否正确。

什么原因可能导致这个错误?

答案1

打开终端,输入
$ man bash
...hit Enter

在这种情况下,您将less显示 bash“手册页”。
如果您点击,h 您将看到有关可用键的简明帮助。q退出帮助。

在帮助中,你会发现/用于启动对模式(正则表达式!)的搜索。因此:

/^PROMPTING将带您进入手册页的部分,其中介绍了可以在提示中使用的特殊功能(转义!PS0PS4

在那里注意\[\]逃脱;
这些会告诉 bash 你包含了不可打印的内容,并在这两者之间包含任何转义符(例如颜色变化),将使提示按你期望的方式工作。

相关内容